<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: transport/struc/msg.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_58e412aa7ace8e71fc01678dc8765e7c.html">transport</a></li><li class="navelem"><a class="el" href="dir_a98fddea045b8b2df4350ebb1d483bf8.html">struc</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">msg.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="msg_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Structured Transport</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright (c) 2023 Akamai Technologies, Inc.; and other contributors.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> * Each commit is copyright by its respective author or author&#39;s employer.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> *</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * Licensed under the MIT License:</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> *</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> * in the Software without restriction, including without limitation the rights</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * furnished to do so, subject to the following conditions:</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> *</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * The above copyright notice and this permission notice shall be included in</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * all copies or substantial portions of the Software.</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> *</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="comment"> * THE SOFTWARE. */</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="comment"></span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="preprocessor">#include &quot;<a class="code" href="transport__fwd_8hpp.html">ipc/transport/transport_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="preprocessor">#include &quot;ipc/transport/struc/schema/detail/structured_msg.capnp.h&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="preprocessor">#include &quot;<a class="code" href="ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html">ipc/transport/struc/error.hpp</a>&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="preprocessor">#include &quot;<a class="code" href="asio__local__stream__socket__fwd_8hpp.html">ipc/transport/asio_local_stream_socket_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="preprocessor">#include &quot;<a class="code" href="native__handle_8hpp.html">ipc/util/native_handle.hpp</a>&quot;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="preprocessor">#include &lt;boost/endian.hpp&gt;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="preprocessor">#include &lt;boost/move/make_unique.hpp&gt;</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1transport_1_1struc.html">ipc::transport::struc</a></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>{</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span> </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"></span> </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment">/**</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> * A structured out-message suitable to be sent via struc::Channel::send() (et al).  Publicly this can be constructed</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * directly; or via struc::Channel::create_msg().  The latter has the advantage of reusing the serialization</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> * engine knobs registered with the channel and hence is simply easier to write.  If one uses the direction-construction</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * route, the builder (serialization) engine type -- Struct_builder #Builder -- must match that of the</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> * struc::Channel used to `send()` a `*this`; otherwise it simply will not compile.</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> *</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * @see &quot;Lifecycle of an out-message&quot; section of struc::Channel class doc header for useful context.</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> *</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> * As explained in that doc section, a Msg_out (struc::Channel::Msg_out) is akin to a container,</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> * like `vector&lt;uint8_t&gt;`; and the #Builder template param + ctor arg are akin to the allocator</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> * used by such a container.  A given `*this` represents the message payload; it does not represent a particular</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> * `send()`t (past/present/future) *instance* of that payload.  Modifying it is akin to modifying the</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> * `vector&lt;uint8_t&gt;`, albeit in structured-schema fashion -- available API controlled by `Message_body` template</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> * param -- and with an optionally attached #Native_handle.</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> *</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> * As explained in that doc section, like any container, once another process has access to it -- which is</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> * only possible in read-only fashion as of this writing -- modifying it must be done with concurrency/synchronization</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> * considered.  If the compile-time-chosen #Builder is SHM-based, then this is a concern.</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> * If it is heap-based (notably Heap_fixed_builder), then it is not: the serialization is *copied* into</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> * and out of the transport.</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> *</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> * After construction, one mutates the message via body_root() and/or store_native_handle_or_null().</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> * You may also use orphanage() to build the message in bottom-up fashion, eventually grafting pieces in via</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> * `body_root()-&gt;....adopt...()`.  See orphanage() doc header for more information on this technique.</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> * Lastly consider the following section for another, more holistic bottom-up appraoch (or perhaps</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> * taking the orphanage technique further).</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> *</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> * ### Advanced technique: Construction from earlier-prepared raw #Capnp_msg_builder_interface ###</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> * To enable the straightforward operation implied above, one uses the 1st/simple ctor form which</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> * by definition necessitates specifying the root schema, #Body (as to contruct one must know the type).</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> * This is typically perfectly natural: a module knows it&#39;s building a message of schema #Body, so they</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> * construct a `Msg_out&lt;Body&gt;` (which already auto-creates a blank #Body via</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> * `initRoot&lt;Body&gt;()`), then fills it out via body_root() (which points to what `initRoot()` returned).</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> * The orphanage technique above is a slight complication, in that things can be built bottom-up, but in any case</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> * by then the root schema already had to be specified, even if it&#39;s actually mutated only somewhat later, once</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> * the component orphan(s) can be plugged in.</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment"> *</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"> * When working with capnp outside of ::ipc, users typically do basically the same thing:</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment"> * start with `M.initRoot&lt;Body&gt;()`, then set stuff in its tree; or in more complex cases maybe use</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment"> * `M.getOrphanage()` from the same `MessageBuilder M` to help build bottom-up.</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment"> *</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment"> * However consider a complex schema `Huge_body` built by collaboration between modules A and B.</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment"> * Now module A may be aware the ultimate product is rooted at</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment"> * `Huge_body`, while module B has no idea, and yet they work together to build parts of the final</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment"> * thing.  In that case B does not necessarily think of any particular overall `Huge_body` tree but only the</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment"> * sub-schema types it cares about; so to it the `MessageBuilder M` is just a memory pool or heap of sorts;</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment"> * it makes whatever structures it wants (via `M.getOrphanage()`) from it but does</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment"> * not call or know about `initRoot&lt;Huge_body&gt;()`.  Conceivably, even, module B is first to run its</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment"> * procedures (before module A) and to create `M` in the first place; and only later module A perhaps</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment"> * finally sets the root (`initRoot&lt;HugeBody&gt;()`) and attaches whatever orphan values module B produces,</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment"> * hooking them into the `HugeBody`.</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment"> *</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment"> * The straightforward use of Msg_out, as described before, does in fact force one (from the start) to</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment"> * specify `HugeBody` by definition (it&#39;s -- again -- a template argument to the class template), and that may not</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment"> * be desirable in this module A-B scenario.  So to support it: use the 2nd/advanced ctor form which</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment"> * takes over (via `std::move()`) an already-created #Builder -- not templated on any schema `Body`.</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment"> * The #Builder exposes the direct `MessageBuilder`, so the tree can be built using whatever features in whatever</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment"> * order one desires... and only *then* create the Msg_out.  The only constraint is that</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment"> * by ctor time, the `MessageBuilder` (a/k/a #Capnp_msg_builder_interface) *is* initialized to be rooted at `Body`;</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment"> * but this could be done anytime up to that point; so module B need not do it, while module A might ultimately</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment"> * do it and then construct the `Msg_out&lt;Body&gt;`.  Alternatively, the user can omit performing</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment"> * `initRoot&lt;Body&gt;()`, and it will be done as needed by the ctor, resulting in a blank message at that point</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment"> * which then can be filled-out via body_root() mutations.  (Note: This is just an example.  The point is</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment"> * with this technique one can use a `MessageBuilder` in any fashion desired, and the only constraint is</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment"> * it is in fact rooted at some structure ``S`, at which point `Msg_out&lt;S&gt;` can be cted.  In that</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment"> * sense it removes any -- albeit typically simplifying -- ipc::transport constraints on how one builds a message,</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment"> * allowing one to use the full builder API provided by capnp without any stylistic concessions.)</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment"> *</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment"> * ### Resource use: RAM ###</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment"> * Creating a `*this`, and mutating it via body_root(), uses proportionally large RAM resources; e.g.,</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment"> * if you successfully store a multi-megabyte blob, `*this` will allocate RAM accordingly.  Conversely,</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment"> * destroying `*this` returns such resources.  However, if #Builder is SHM-based, then a process-counting</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment"> * ref-count (conceptually) exists.  It is 1 after construction.  It is incremented each time</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment"> * it is `struc::Channel::send()`t.  For each such increment, there is a decrement when the receiving</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment"> * process&#39;s counterpart Msg_in, which is always passed-around by `shared_ptr`, is no longer</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment"> * owned by that process (when that `shared_ptr` group&#39;s ref-count drops to zero).  Once `*this` is destroyed,</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment"> * *and* each `send()` target process has both yielded the struc::Channel::Msg_in_ptr and let that</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment"> * `shared_ptr` drop to ref-count-zero, the backing RAM is released.</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment"> *</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment"> * ### Resource use: the #Native_handle (if any) ###</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment"> * It is returned to the OS by our destructor.  This does not, necessarily, destroy whatever resource it references:</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment"> * presumably the idea is to send it, via IPC, to the opposing process.  The handle (FD) that process receives</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment"> * is really a new one in that process&#39;s table; there are at that point two *descriptors* referencing one</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment"> * resource *description*, and the latter disappears in the kernel only once both descriptors go away.</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment"> * If you do not wish to let the local handle (FD) be destroyed by `*this` destructor, consider (in Unix-type OS)</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment"> * passing-in `dup(your_hndl)` instead of `your_hndl` itself.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment"> *</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment"> * The #Native_handle, if any, stored via store_native_handle_or_null() is not a part of the</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment"> * serialization/deserialization/sharing schema described above.  It just sits in `*this` until `*this` dtor runs</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment"> * (or it is replaced/unloaded via store_native_handle_or_null()).  If at send() time there&#39;s one in `*this`,</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment"> * then a copy is transmitted to the recipient process.  store_native_handle_or_null() on `*this` will never</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment"> * have any direct effect on any received copy.</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment"> *</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment"> * @internal</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment"> * ### Impl notes ###</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"> * Some important aspects of this class template&#39;s API, which must be accessed by the ipc::transport (structured</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment"> * layer) internals only, are `protected`.  struc::Channel then sub-classes this guy and exposes them publicly</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment"> * (to itself).  This avoids `friend` which would would be not quite as clean, since `private` parts would be</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment"> * exposed too, and so on.  In other words this is a class an API -- not a mere data-store -- but there is</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment"> * an internally used API which is left `protected`.  As of this writing it&#39;s essentially emit_serialization()</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment"> * which the user does not access directly (struc::Channel::send() internals do).</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment"> *</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment"> * The internally-used APIs are reasonably self-explanatory, so just see their doc headers.</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment"> * @endinternal</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment"> *</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment"> * @tparam Message_body</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment"> *         See struc::Channel.</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment"> * @tparam Struct_builder_t</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment"> *         See struc::Channel.</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment"> */</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Message_body, <span class="keyword">typename</span> Struct_builder_t&gt;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">  153</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>{</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment"></span> </div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment">  /// See struc::Channel::Msg_body.</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aab352abf2ced76f2bad6700d75290132">  159</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aab352abf2ced76f2bad6700d75290132">Body</a> = Message_body;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment"></span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment">  /// Short-hand for capnp-generated mutating `Builder` nested class of #Body.  See body_root().</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">  162</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">Body_builder</a> = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">Body::Builder</a>;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment"></span> </div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">   * Short-hand for user-specified Struct_builder type.  An internally stored instance of this contains the user</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   * payload.</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   */</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">  168</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">Builder</a> = Struct_builder_t;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment"></span> </div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment">   * Short-hand for user-specified Struct_builder::Config.  One can construct a #Builder via</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment">   * `Builder(const Builder_config&amp;)`.</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment">   */</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a0e66b941a2b67ec21087581d1e44f42b">  174</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a0e66b941a2b67ec21087581d1e44f42b">Builder_config</a> = <span class="keyword">typename</span> Builder::Config;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment"></span> </div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">  /// Short-hand for capnp orphan factory.  See orphanage().</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#acd04d61cf19ad87610598fddbb5d8052">  177</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#acd04d61cf19ad87610598fddbb5d8052">Orphanage</a> = ::capnp::Orphanage;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span> </div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment"></span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment">   * Creates blank #Body-bearing out-message message, with no native handle,</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment">   * all of which can be modified via body_root() and the ancillary mutator store_native_handle_or_null().</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment">   *</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment">   * See also the alternate (advanced-technique) ctor form which may be more suitable in more complex scenarios.</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   * This is discussed in our class doc header.</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a134e737e55ae825527efd6a9e68bf37e">  187</a></span><span class="comment">   *</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span><span class="comment">   * ### Obtaining the #Builder_config object ###</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span><span class="comment">   * In the first place it is often easier/better to not invoke this ctor directly but rather</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment">   * invoke struc::Channel::create_msg() which will do so for you and supply the proper #Builder_config.</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment">   * However it is definitely possible for a Msg_out to be constructed orthogonally to a</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment">   * particular struc::Channel -- or even to a particular ipc::Session (if even applicable).  How to get</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment">   * the `struct_builder_config` arg for this ctor then?  Informally: if you&#39;re constructing the #Builder_config</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">   * directly, you&#39;re probably not doing the right thing.  The following places are available to obtain one</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   * for safety and efficiency (and code maintainability):</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   *   - From another, compatible, struc::Channel via struc::Channel::struct_builder_config().</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment">   *   - Heap-backed:</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment">   *     - If you have a target struc::Channel::Owned_channel: via `static`</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment">   *       struc::Channel::heap_fixed_builder_config().</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="comment">   *     - Otherwise: session::Session_mv::heap_fixed_builder_config() (`static` or non-`static`).</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment">   *   - SHM-backed (e.g., SHM-classic):</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment">   *     - session::shm::classic::Session_mv::session_shm_builder_config(),</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment">   *       session::shm::classic::Session_mv::app_shm_builder_config().  Requires a `Session` object.</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment">   *     - session::shm::classic::Session_server::app_shm_builder_config() (requires session::Client_app).</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment">   *       Server-only; if a `Session` is not available or applicable.</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment">   *</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span><span class="comment">   * @param struct_builder_config</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment">   *        See above.  This is neither memorized nor copied.</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment">   */</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9d4ab66d2740f40a88f476d46dd04f1e">  210</a></span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9d4ab66d2740f40a88f476d46dd04f1e">Msg_out</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a0e66b941a2b67ec21087581d1e44f42b">Builder_config</a>&amp; struct_builder_config);</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment"></span> </div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment">   * Advanced technique: Creates message by subsuming the provided already-prepared</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span><span class="comment">   * `Capnp_msg_builder_interface`-bearing, root-initialized-to-#Body #Builder object (which is moved-to `*this`),</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span><span class="comment">   * with no native handle, all of which can be (further) modified via body_root() and the ancillary</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="comment">   * mutator store_native_handle_or_null().</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment">   *</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span><span class="comment">   * The advanced technique revolving around the use of this ctor form is discussed in our class doc header.</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment">   * That said:</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">   *   - `*struct_builder.payload_msg_builder()` -- a #Capnp_msg_builder_interface -- *must* already have</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">   *     been root-initialized, and the root type *must* be #Body; or *must* not have been root-initialized</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   *     at all (in which case the ctor will perform `initRoot&lt;Body&gt;()`).</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment">   *     - If it was already root-initialized, but not with `&lt;Body&gt;`, then behavior is undefined, and the trouble</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment">   *       may only be detected on the opposing side upon receipt of `*this` message, in trying to</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment">   *       deserialize it in Msg_in.</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">   *     - If you chose to not root-initialize before this ctor, and therefore it performs `initRoot&lt;Body&gt;()`,</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment">   *       then naturally the message root tree shall be blank, similarly to the other/vanilla ctor.</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment">   *     - This is typically accomplished via `struct_builder.payload_msg_builder()-&gt;initRoot&lt;Body&gt;()`, although</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment">   *       there are other techniques available.  See capnp docs for `capnp::MessageBuilder`</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">   *       (#Capnp_msg_builder_interface).</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">   *   - That having been guaranteed, the message may be further mutated via body_root().</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span><span class="comment">   *     - Naturally it may also have already been mutated (beyond `initRoot()`/etc.), possibly to its final intended</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span><span class="comment">   *       form.</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment">   *     - Conversely, in practice, if you chose to not root-initialize `struct_builder`, you&#39;ll want to in fact</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span><span class="comment">   *       use body_root() mutations to actually load the message with something useful.</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="comment">   *</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span><span class="comment">   * For exposition purposes: note that the other ctor form, which takes a `Builder::Config`, behaves as-if</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span><span class="comment">   * delegating to the present ctor: `Msg_out(Builder(struct_builder_config))`.</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span><span class="comment">   * When creating a straightforward message in ~one place in the user code, using that other ctor form is</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span><span class="comment">   * usually therefore more convenient, avoiding some boiler-plate.</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span><span class="comment">   *</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span><span class="comment">   * @param struct_builder</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span><span class="comment">   *        See above.  Note the requirements listed.</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment">   */</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9738acbcfb431dc1fc0174b42787060b">  245</a></span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9738acbcfb431dc1fc0174b42787060b">Msg_out</a>(<a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">Builder</a>&amp;&amp; struct_builder);</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span><span class="comment"></span> </div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment">  /// Creates non-message; any operation except move-to or destruction results in undefined behavior subsequently.</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9289790ac6b85681c8697fc55ff8f3a7">  248</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9289790ac6b85681c8697fc55ff8f3a7">Msg_out</a>();</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="comment"></span> </div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment">   * Move ctor: Make `*this` equal to `src`, while `src` becomes as-if default-cted (in that any operation</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span><span class="comment">   * except move-to or destruction results in undefined behavior subsequently).</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span><span class="comment">   *</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment">   *        Source object.</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span><span class="comment">   */</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a50c8fd96304e09aaf9bbacd9959c07d6">  257</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a50c8fd96304e09aaf9bbacd9959c07d6">Msg_out</a>(<a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;&amp; src);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span><span class="comment"></span> </div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span><span class="comment">  /// Disallow copying.</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9e5271db0ea2b86ec4c68a91c60dd17a">  260</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9e5271db0ea2b86ec4c68a91c60dd17a">Msg_out</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span><span class="comment"></span> </div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span><span class="comment">   * Returns resources, including potentially significant RAM resources and native_handle_or_null(), taken throughout;</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span><span class="comment">   * in the case of SHM-based RAM resources their return may be delayed until counterpart `Msg_in`s</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span><span class="comment">   * are also destroyed.  See class doc header for discussion.</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span><span class="comment">   */</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6fe17e3ce3e3569e7b08538f525918e9">  267</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6fe17e3ce3e3569e7b08538f525918e9">~Msg_out</a>();</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span> </div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span><span class="comment"></span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment">   * Move assignment: Destroy `*this` contents; make `*this` equal to `src`, while `src` becomes as-if</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">   * default-cted (in that any operation except move-to or destruction results in undefined behavior subsequently).</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">   * no-op if `&amp;src == this`.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment">   *</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment">   *        Source object.</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment">   * @return `*this`.</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment">   */</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6a9b086eedafe0a5fc71695812677cdb">  280</a></span>  <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6a9b086eedafe0a5fc71695812677cdb">operator=</a>(<a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;&amp; src);</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment"></span> </div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment">  /// Disallow copying.</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a53a9746fdabdefcaf1f9bf63c81c6d85">  283</a></span><span class="comment"></span>  <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a53a9746fdabdefcaf1f9bf63c81c6d85">operator=</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment"></span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="comment">   * The #Body root capnp-generated mutator object.  E.g.: `this-&gt;body_root()-&gt;initSomeStruct().setSomeField(123)`</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span><span class="comment">   * will create the capnp-`struct`-typed root field `someStruct` and set the value `someField` -- presumably an</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span><span class="comment">   * integer -- within it.  The pointer returned shall always be the same value until `*this` is destroyed.</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span><span class="comment">   *</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span><span class="comment">   * #Body_builder is light-weight, so you may make a copy and then mutate via that, if desired.  However</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span><span class="comment">   * whether `*(body_root())` or such a copy, such a `Builder` object may not be accessed after `*this` is destroyed.</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span><span class="comment">   *</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span><span class="comment">   * Informally we recommend against copying `*(body_root())`: Light-weight or not, it&#39;s a copy, and copying a pointer</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span><span class="comment">   * is cheaper; and it may not live past `*this` anyway; and body_root() always returns the same pointer.  So just</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span><span class="comment">   * store the pointer (or reference from it).</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span><span class="comment">   *</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span><span class="comment">   * ### Quick capnp tips ###</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span><span class="comment">   * You should really read all of capnp docs at its web site.  They are very useful and well written and not</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span><span class="comment">   * overly formal despite being quite comprehensive.  That said a couple of gotchas/tips:</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span><span class="comment">   *   - On a `Builder`, `.getX()` and `.setX()` are lightning-fast, like accessing `struct` members directly --</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span><span class="comment">   *     but only when `X` is of a scalar type.  Compound types, where `.getX()` returns not a native type</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span><span class="comment">   *     but another `Builder`, need to perform some pointer checking and are slower.  Therefore,</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span><span class="comment">   *     if you plan to `.getX()` and then `.setA()` and `.setB()` (and similar) on that `X`, you should</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span><span class="comment">   *     save the result (`auto x = ....getX();`); then mutate via the saved result (`x.setA(...); x.setB(...)`).</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span><span class="comment">   *   - Let `X` be a compound field, particularly `List`, `Text` (string/list-of-characters),</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span><span class="comment">   *     `Data` (list-of-bytes).  It is usually, to begin, null; you must perform `.initX(size_t n)` or equivalent</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span><span class="comment">   *     to initialize it (fill it with `n` zeroes).  However, suppose you are mutating a message, such as</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="comment">   *     a previously-sent message, and wish to *modify* the `X`.  If the new value might have the same length (which is</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span><span class="comment">   *     common), the correct thing to do is: check `.hasX()`; if `true`, modify `.getX()`;</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span><span class="comment">   *     but if `false` then `.initX(n)` (as `X` was null after all).  Performing `.initX()` on an already-`.initX()`ed</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span><span class="comment">   *     value works but has a nasty invisible effect: the existing datum continues taking space in the</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span><span class="comment">   *     serialization; the new datum takes a new chunk of the serialization segments (and might even cause</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span><span class="comment">   *     the allocation of a new segment if needed).  As of this writing capnp does not reuse such orphaned</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span><span class="comment">   *     space.  If the new `n` equals the old `n`, this is a straight waste of RAM; and can lead to pathologically</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span><span class="comment">   *     growing memory leaks if done many times.</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">   *     - However, if the new `n` is different from the preceding, then there is no choice but to</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="comment">   *       re-`.initX()`.  A list/blob/string&#39;s size cannot be modified in capnp.</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">   *     - It is best to avoid any situation where the `n` would change; try to design your protocol differently.</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span><span class="comment">   *</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="comment">   */</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9894ad7ec2a46641c4b9b86664d0d465">  322</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">Body_builder</a>* <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9894ad7ec2a46641c4b9b86664d0d465">body_root</a>();</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span><span class="comment"></span> </div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span><span class="comment">   * Equivalent to the other body_root() overload but immutable version.  May be useful for, say, pretty-printing it</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span><span class="comment">   * to log (e.g.: `capnp::prettyPrint(M.body_root()-&gt;asReader()).flatten().cStr()`).</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span><span class="comment">   *</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span><span class="comment">   */</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a66eade858d6b311d6e2d633b43ee71ad">  330</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">Body_builder</a>* <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a66eade858d6b311d6e2d633b43ee71ad">body_root</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span><span class="comment"></span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span><span class="comment">   * Convenience method that returns a `capnp::Orphan` factory in the same `capnp::MessageBuilder` as body_root().</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span><span class="comment">   * Therefore `Orphan`s generated via the returned #Orphanage can be `adopt...()`ed by the `Builder` `*(body_root())`</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span><span class="comment">   * and its various sub-fields&#39; `Builder`s (at any depth).</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span><span class="comment">   *</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span><span class="comment">   * ### Suggested technique ###</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span><span class="comment">   * In general, the orphan concept is discussed briefly but usefully in the &quot;C++ serialization&quot; section of</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="comment">   * capnp docs (the web site).  We do not attempt to get into all these topics.  However consider the following</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="comment">   * pattern.</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span><span class="comment">   *</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span><span class="comment">   * In general the Flow-IPC system places almost no constraints on #Body (the schema), but there is one:</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span><span class="comment">   * Generally there must be an anonymous capnp-`union` at the top of #Body, and in practice any message will</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span><span class="comment">   * eventually load the root (body_root()) with one of the `union` choices.  (This is to operate within the</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span><span class="comment">   * struc::Channel::expect_msg() and struc::Channel::expect_msgs() APIs.)  The vanilla approach to building</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span><span class="comment">   * the message is top-down: body_root() is pre-initialized to be a #Body; then, say, if your plan is to</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span><span class="comment">   * load it with the `union` choice `someChoice`, then you&#39;d do `body_root()-&gt;initSomeChoice()`; then</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span><span class="comment">   * mutate stuff inside the `Builder` returned by that.  There could be an arbitrarily complex sub-tree within that,</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   * built top-down in the same fashion.</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span><span class="comment">   *</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment">   * Instead you may choose to build it bottom-up.  For this discussion let&#39;s assume `struct SomeChoice`</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span><span class="comment">   * has a number of scalars.  You would first obtain and save an `Orphanage`:</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span><span class="comment">   * `auto orphan_factory = M.orphanage()`.  Next you would create an orphan, not yet connected to the root</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span><span class="comment">   * body_root(), like so:</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span><span class="comment">   * `auto some_choice_orphan = orphan_factory.newOrphan&lt;SomeChoice&gt;(); some_choice_builder = some_choice_orphan.get()`.</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span><span class="comment">   * Next you&#39;d set the scalars within it: `some_choice_builder.set...(...)`.  Lastly, when it&#39;s ready, graft it into</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span><span class="comment">   * the actual root: `body_root()-&gt;adoptSomeChoice(some_choice_orphan)`.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span><span class="comment">   *</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span><span class="comment">   * Due to the simplicity of this example one might wonder why not simply build it top-down in the first place.</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span><span class="comment">   * Indeed.  However, if `struct SomeChoice` is a complex tree of `struct`s within `List`s within (...),</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span><span class="comment">   * it would be reasonable to build the lowest levels of that tree by generating intermediate orphans</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span><span class="comment">   * (via `orphan_factory.newOrphan&lt;LowerLevelStructOrListOrWhatever&gt;()`), adopting them into higher-level</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span><span class="comment">   * orphans, and so on, finishing it via the top-level `body_root()-&gt;adoptSomeChoice()` call.</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span><span class="comment">   *</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span><span class="comment">   * ### Similar technique ###</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span><span class="comment">   * See also the 2nd (advanced) ctor form.  It allows one to do the above but takes it further by not even</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="comment">   * needing a Msg_out until the time comes to actually struc::Channel::send() the message.</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span><span class="comment">   * I.e., one would work with essentially a #Capnp_msg_builder_interface directly, including</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span><span class="comment">   * invoking `Capnp_msg_builder_interface.getOrphanage()`.</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span><span class="comment">   *</span></div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span><span class="comment">   */</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9303c71f8f459ede25ebe0c8f5492393">  373</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#acd04d61cf19ad87610598fddbb5d8052">Orphanage</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9303c71f8f459ede25ebe0c8f5492393">orphanage</a>();</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span><span class="comment"></span> </div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span><span class="comment">   * Store the `Native_handle` (potentially `.null()`, meaning none) in this out-message; no-ops if the same</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span><span class="comment">   * `.m_native_handle` already stored; otherwise returns the previously stored native handle to the OS</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span><span class="comment">   * (similarly to dtor).</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span><span class="comment">   *</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="comment">   * @param native_handle_or_null</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span><span class="comment">   *        The `Native_handle` (`.null() == true` if none) to move into `*this`.  Made `.null() == true` upon return.</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span><span class="comment">   */</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aced8ef8237617c74aaf06832d1385fed">  383</a></span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aced8ef8237617c74aaf06832d1385fed">store_native_handle_or_null</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>&amp;&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#ae033461f1404be60262033bafcfaccba">native_handle_or_null</a>);</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span><span class="comment"></span> </div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span><span class="comment">   * Returns whatever was the last word according to store_native_handle_or_null().  Note it is a copy;</span></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span><span class="comment">   * `*this` retains ownership of the OS resource.</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span><span class="comment">   *</span></div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span><span class="comment">   * @return See ctor (which stores no handle), store_native_handle_or_null().</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span><span class="comment">   */</span></div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#ae033461f1404be60262033bafcfaccba">  391</a></span>  <a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#ae033461f1404be60262033bafcfaccba">native_handle_or_null</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span><span class="comment"></span> </div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span><span class="comment">   * Prints string representation to the given `ostream`.  This representation lacks newlines/indentation;</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span><span class="comment">   * includes a (potentially truncated) pretty-printed representation of `body_root()` contents; and includes</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span><span class="comment">   * native_handle_or_null().</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span><span class="comment">   *</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span><span class="comment">   * Caution: This could be an operation expensive in processor cycles and, temporarily, RAM; and thus should</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span><span class="comment">   * be used judiciously.  To help drive your decision-making: This method, internally,</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span><span class="comment">   *   -# uses capnp `kj::str(*(this-&gt;body_root))` to generate a *full* pretty-print of body_root() contents;</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span><span class="comment">   *   -# truncates the result of the latter, as needed for a reasonably short output, and prints the result;</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span><span class="comment">   *   -# adds native_handle_or_null() and possibly a few other small information items.</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span><span class="comment">   *</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span><span class="comment">   * Because there is no reasonably-available way to stop generating the pretty-print in step 1 upon reaching</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span><span class="comment">   * a certain number of characters, the operation may take a while, if many non-default bytes have been</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">   * mutated-in; and before truncation the resulting string may take significant RAM accordingly.</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">   *</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span><span class="comment">   *        Stream to which to write.</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">   */</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a754e0f025f471105d52b3b090c27f1c0">  411</a></span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a754e0f025f471105d52b3b090c27f1c0">to_ostream</a>(std::ostream* os) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span> </div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span><span class="comment"></span> </div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span><span class="comment">   * Returns the serialization in the form of a sequence of 1+ `Blob`s.</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span><span class="comment">   * It is meant to be invoked at struc::Channel::send() time.</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span><span class="comment">   *</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span><span class="comment">   * It can be invoked repeatedly: `session` can specify a different destination each time; or the same</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span><span class="comment">   * destination each time; or an arbitrary mix thereof.  In particular struc::Channel::send() (and its</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="comment">   * derivatives struc::Channel::sync_request(), struc::Channel::async_request()) shall each time specify the</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span><span class="comment">   * channel&#39;s opposing process as the destination -- regardless of which struc::Channel&#39;s</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span><span class="comment">   * struc::Channel::create_msg() originally generated `*this` (assuming that method was even used for</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span><span class="comment">   * construction of `*this` -- in no way required, just often convenient).</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span><span class="comment">   *</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span><span class="comment">   * @see our class doc header and/or &quot;Lifecycle of an out-message&quot; section of struc::Channel class doc</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span><span class="comment">   *      header.  Recall that where it mentions struc::Channel::send(), you can understand</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span><span class="comment">   *      there a 1-1 relationship with a synchronous call to `this-&gt;emit_serialization()`.</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span><span class="comment">   *</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span><span class="comment">   * ### Errors ###</span></div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span><span class="comment">   * See Struct_builder::emit_serialization().  This essentially forwards to that and emits its errors if any.</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span><span class="comment">   * Out-arg `native_handle_or_null` is untouched on error.</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span><span class="comment">   *</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span><span class="comment">   * @param target_blobs</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span><span class="comment">   *        On success (no error emitted) this is cleared and replaced with the sequence of segments as `Blob`s.</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span><span class="comment">   * @param session</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span><span class="comment">   *        Specifies the opposing recipient for which the serialization is intended.</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span><span class="comment">   *        If `Builder::Session` is Null_session, then `Session()` is the only value to supply here.  Otherwise more</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span><span class="comment">   *        information is necessary.</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span><span class="comment">   *        See `flow::Error_code` docs for error reporting semantics.  See above.</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span><span class="comment">   */</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a91d2575343b28f83e22a71e7f7b3ff40">  444</a></span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a91d2575343b28f83e22a71e7f7b3ff40">emit_serialization</a>(<a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#a82a69eaa39cbe8a002de1266f1cbb5cb">Segment_ptrs</a>* target_blobs, <span class="keyword">const</span> <span class="keyword">typename</span> Builder::Session&amp; session,</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>                          <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span><span class="comment"></span> </div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span><span class="comment">   * Returns what `target_blobs.size()` would return after calling `emit_serialization(&amp;target_blobs)` (with</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span><span class="comment">   * an empty `target_blobs` going-in), right now.</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span><span class="comment">   *</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span><span class="comment">   */</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#adb630aeb1bb9e9335631f9e9e6dc25de">  453</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#adb630aeb1bb9e9335631f9e9e6dc25de">n_serialization_segments</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span> </div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span><span class="comment"></span> </div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span><span class="comment">  /// The guy serializing a #Body.  Underlying serialization potentially futher mutated by user via body_root().</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aa783b92d94937ebb5d95b7ad5f2c9e37">  459</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">Builder</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aa783b92d94937ebb5d95b7ad5f2c9e37">m_builder</a>;</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span><span class="comment"></span> </div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span><span class="comment">   * See body_root().</span></div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span><span class="comment">   *</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span><span class="comment">   * ### Rationale ###</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span><span class="comment">   * We don&#39;t strictly need to save this; we could have body_root() return the #Body_builder, not a pointer to</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span><span class="comment">   * it.  This would not be out of line; it is a general capnp-documented tip to act on a given `Builder` repeatedly</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span><span class="comment">   * as opposed to accessing it via an accessor each time; so we could encourage the user to do that -- not</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span><span class="comment">   * our problem.  (Though I (ygoldfel) am not positive that perf tip applies to the root capnp-`struct`; maybe</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span><span class="comment">   * look into it sometime for education.)  It would also reduce `*this` footprint a bit and simplify/speed-up</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span><span class="comment">   * the move-ctor and move-assignment somewhat (a capnp `Builder` is light-weight but not totally tiny, consisting</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span><span class="comment">   * of a few pointers and integers).  So why do this?</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span><span class="comment">   *</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span><span class="comment">   * Honestly keeping it this way is firstly a historic artifact from an earlier situation where keeping a</span></div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span><span class="comment">   * pointer made sense in a no-longer-relevant sense (explaining how here would be uninteresting).</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span><span class="comment">   * That said it&#39;s a fairly cheap little optimization that allows the repeated use of body_root() with no perf</span></div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span><span class="comment">   * penalty, and it is nice and expressive to have a non-`const` accessor returning a pointer to *the*</span></div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span><span class="comment">   * thing that would mutate `*this`.  Similarly it&#39;s nice to have a `const` accessor returning pointer-to-`const`</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span><span class="comment">   * suitable for pretty-printing.  Throw in now having to change existing call sites, and voila, this decision.</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span><span class="comment">   */</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a90ba424b2c68cae89597356458b5c570">  480</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">Body_builder</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a90ba424b2c68cae89597356458b5c570">m_body_root</a>;</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span><span class="comment"></span> </div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span><span class="comment">  /// The `Native_handle`, if any, embedded inside this message.</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a31538b5675e0deb607f74d97e9205cf6">  483</a></span><span class="comment"></span>  <a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a31538b5675e0deb607f74d97e9205cf6">m_hndl_or_null</a>;</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>}; <span class="comment">// class Msg_out</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span><span class="comment"></span> </div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span><span class="comment">/**</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span><span class="comment"> * A structured in-message *instance* suitable as received and emittable (to user) by struc::Channel. Publicly</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span><span class="comment"> * these are never constructed but emitted into `Channel`-passed handlers, wrapped into `shared_ptr`</span></div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span><span class="comment"> * struc::Channel::Msg_in_ptr.  These handlers include struc::Channel::expect_msg(),</span></div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span><span class="comment"> * struc::Channel::expect_msgs(), and struc::Channel::async_request() and struc::Channel::sync_request().</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span><span class="comment"> * Once available to the user, one accesses the in-place (zero-copy) capnp serialization via body_root(),</span></div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="comment"> * via which one can access the message&#39;s read-only contents.</span></div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span><span class="comment"> *</span></div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span><span class="comment"> * @see Msg_out</span></div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span><span class="comment"> * @see &quot;Lifecycle of an out-message&quot; section of struc::Channel class doc header for useful context.</span></div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span><span class="comment"> *      Note that for each Msg_out, there will exist 0+ `Msg_in`s, one per</span></div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="comment"> *      successful `send()` (et al) paired with emission to user via aformentioned handlers.  The latter represent</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="comment"> *      each instance of the original message being received; the former represents the original message.</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span><span class="comment"> *      Hence Msg_in access is read-only (`Reader` access only); Msg_out access</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span><span class="comment"> *      is read/write (`Builder` access).</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span><span class="comment"></span> </div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="comment"> * ### Resource use: RAM ###</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="comment"> * If #Reader_config is non-SHM-based, then a `*this` is analogous to a Msg_out; the</span></div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="comment"> * RAM used is released once `*this` is destroyed.  If it *is* SHM-based, then the cross-process ref-count</span></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span><span class="comment"> * scheme explained in Msg_out doc header is in force.</span></div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span><span class="comment"> *</span></div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span><span class="comment"> * ### Resource use: the #Native_handle (if any) ###</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span><span class="comment"> * Firstly see similarly named section in Msg_out doc header.  In particular note that</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span><span class="comment"> * the `*this`-stored descriptor is not the same descriptor as the one in the out-message object;</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span><span class="comment"> * rather it&#39;s a descriptor in a different process referring to the the same description, with an OS/kernel-held</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span><span class="comment"> * ref-count.</span></div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span><span class="comment"> *</span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span><span class="comment"> * Even if `*this` stores a non-null #Native_handle, it will never return it to the OS on your behalf.</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span><span class="comment"> * You may do so if and when desired.  This is different from Msg_out which &quot;owns&quot; its copy</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span><span class="comment"> * and will return it to the OS at destruction.</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span><span class="comment"> *</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="comment"> * @internal</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="comment"> * ### Impl notes ###</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span><span class="comment"> * This follows the same facade-API pattern as Msg_out; see similar place in its doc header.</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span><span class="comment"> * Same applies here.  However: Msg_in represents an *instance* of a received message.  Therefore it</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span><span class="comment"> * contains *both*</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span><span class="comment"> *   - metadata-message about the associated user-message, if any, or the internal message; message ID,</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span><span class="comment"> *     originating message ID, etc.; and</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span><span class="comment"> *   - the user message (if any).</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span><span class="comment"> *</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span><span class="comment"> * So, in fact, on the sender side struc::Channel maintains the user&#39;s Msg_out (if any) and</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span><span class="comment"> * a user-invisible (created at send() time) Msg_mdt_out, which is just a somewhat-decorated-API</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span><span class="comment"> * Msg_out over an internal-use schema.  On the receiver side Msg_in stores</span></div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span><span class="comment"> * *both* counterpart read-only deserializations.</span></div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span><span class="comment"> *   - body_root() provides `public` user access to the user body;</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="comment"> *   - `protected` accessors provide access to the other stuff, like id_or_none() and originating_msg_id_or_none(),</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span><span class="comment"> *     which struc::Channel uses to maintain operation.  These are `public`ly exposed via Msg_out_impl.</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span><span class="comment"> *</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span><span class="comment"> * In the case of an internal message, a `*this` is never emitted to the user.  In that case</span></div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span><span class="comment"> * internal_msg_body_root() provides internal access to the message.</span></div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span><span class="comment"> *</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span><span class="comment"> * @endinternal</span></div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span><span class="comment"> *</span></div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span><span class="comment"> * @tparam Message_body</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span><span class="comment"> *         See Msg_in: this is the counterpart.</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span><span class="comment"> * @tparam Struct_reader_config</span></div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span><span class="comment"> *         See Msg_out: this is the counterpart.</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span><span class="comment"> */</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Message_body, <span class="keyword">typename</span> Struct_reader_config&gt;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html">  545</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__in.html">Msg_in</a> :</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span>  <span class="keyword">private</span> boost::noncopyable</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>{</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span><span class="comment"></span> </div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span><span class="comment">  /// See struc::Channel::Msg_body.</span></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa408e309fcb402c061d969742874ca6c">  552</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa408e309fcb402c061d969742874ca6c">Body</a> = Message_body;</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span><span class="comment"></span> </div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span><span class="comment">  /// Short-hand for capnp-generated read-only-accessing `Reader` nested class of #Body.  See body_root().</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6e21b165a0673138db44d86584dd5059">  555</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6e21b165a0673138db44d86584dd5059">Body_reader</a> = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">Body::Reader</a>;</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span><span class="comment"></span> </div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="comment">  /// See struc::Channel::Reader_config.</span></div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">  558</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">Reader_config</a> = Struct_reader_config;</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span> </div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span><span class="comment"></span> </div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span><span class="comment">   * Returns resources, potentially including potentially significant RAM resources, taken before emitting to the user.</span></div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span><span class="comment">   * native_handle_or_null(), even if not `.null()`, is not returned to the OS.</span></div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span><span class="comment">   *</span></div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span><span class="comment">   * See class doc header for discussion.</span></div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="comment">   */</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a234708ed176f270f6372536ba3571b9a">  568</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a234708ed176f270f6372536ba3571b9a">~Msg_in</a>();</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span> </div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span><span class="comment"></span> </div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span><span class="comment">   * The #Body root capnp-generated accessor object.  E.g.: `this-&gt;body_root().getSomeStruct().setSomeField()`</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="comment">   * will access the capnp-`struct`-typed root field `someStruct` and pluck out the value `someField` -- presumably an</span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="comment">   * integer -- within it.  The ref returned shall always be to the same address until `*this` is destroyed.</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span><span class="comment">   *</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span><span class="comment">   * #Body_reader is light-weight, so you may make a copy and then access via that, if desired.  However</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span><span class="comment">   * whether `body_root()` itself or such a copy, such a `Reader` object may not be accessed after `*this` is destroyed.</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span><span class="comment">   *</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span><span class="comment">   * Informally we recommend against value-copying body_root(): Light-weight or not, it&#39;s a copy, and copying a</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span><span class="comment">   * pointer/cref is cheaper; and it may not live past `*this` anyway; and body_root() always returns the same address.</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span><span class="comment">   * So just store the cref (or pointer-to-`const` with the same addr).</span></div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span><span class="comment">   *</span></div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span><span class="comment">   * ### Quick capnp tips ###</span></div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span><span class="comment">   * You should really read all of capnp docs at its web site.  They are very useful and well written and not</span></div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span><span class="comment">   * overly formal despite being quite comprehensive.  That said a couple of gotchas/tips:</span></div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span><span class="comment">   *   - On a `Reader`, `.getX()` is lightning-fast, like accessing `struct` members directly --</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span><span class="comment">   *     but only when `X` is of a scalar type.  Compount types, where `.getX()` returns not a native type</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span><span class="comment">   *     but another `Reader`, need to perform some pointer checking and are slower.  Therefore,</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span><span class="comment">   *     if you plan to `.getX()` and then `.getA()` and `.getB()` (and similar) on that `X`, you should</span></div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span><span class="comment">   *     save the result (`auto x = ....getX();`); then access via the saved result</span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span><span class="comment">   *     (`a = x.getA(...); b = x.getB(...)`).</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="comment">   *</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span><span class="comment">   * To pretty-print (with indent/newlines) you can use: `capnp::prettyPrint(M.body_root()).flatten().cStr()`.</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="comment">   *</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="comment">   */</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6e21b165a0673138db44d86584dd5059">Body_reader</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a56fa38feb9c907ae3f0f1a6ff16dd32f">body_root</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span><span class="comment"></span> </div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span><span class="comment">   * The #Native_handle -- potentially null meaning none -- embedded in this message.</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span><span class="comment">   *</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span><span class="comment">   */</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>  <a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aba0b83c9d8a7e8f782202406ca387e2c">native_handle_or_null</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span><span class="comment"></span> </div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span><span class="comment">   * Prints string representation to the given `ostream`.  This representation lacks newlines/indentation;</span></div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span><span class="comment">   * includes a (potentially truncated) pretty-printed representation of `body_root()` contents; and includes</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span><span class="comment">   * native_handle_or_null().</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno">  611</span><span class="comment">   *</span></div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span><span class="comment">   * Caution: This could be an operation expensive in processor cycles and, temporarily, RAM; and thus should</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span><span class="comment">   * be used judiciously.  To help drive your decision-making: This method, internally,</span></div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span><span class="comment">   *   -# uses capnp `kj::str(this-&gt;body_root)` to generate a *full* pretty-print of body_root() contents;</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span><span class="comment">   *   -# truncates the result of the latter, as needed for a reasonably short output, and prints the result;</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span><span class="comment">   *   -# adds native_handle_or_null() and possibly a few other small information items.</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span><span class="comment">   *</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span><span class="comment">   * Because there is no reasonably-available way to stop generating the pretty-print in step 1 upon reaching</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span><span class="comment">   * a certain number of characters, the operation may take a while, if many non-default bytes have been</span></div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span><span class="comment">   * mutated-in; and before truncation the resulting string may take significant RAM accordingly.</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span><span class="comment">   *</span></div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span><span class="comment">   * @internal</span></div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span><span class="comment">   * If used by internal code before successful deserialize_mdt() and/or before successful deserialize_body()</span></div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span><span class="comment">   * (if one would even be possible in the first place -- not so with internal messages), this method will print</span></div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span><span class="comment">   * useful things.  Moreover the above public-facing description is no longer complete in that case.</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="comment">   * In any case the method remains suitable for TRACE-logging but not INFO-logging by internal code, at least</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span><span class="comment">   * in the per-message common code path.</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span><span class="comment">   * @endinternal</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span><span class="comment">   *</span></div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span><span class="comment">   *        Stream to which to write.</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span><span class="comment">   */</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4783bd852b1dcba1542e0cfe37205e9e">to_ostream</a>(std::ostream* os) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span> </div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span><span class="comment"></span> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span><span class="comment">  /// `Reader` counterpart to Msg_mdt_out::Internal_msg_body_builder.</span></div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#afdc86a45b50e9869329b11a1e576b172">  639</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#afdc86a45b50e9869329b11a1e576b172">Internal_msg_body_reader</a> = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">schema::detail::StructuredMessage::InternalMessageBody::Reader</a>;</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span><span class="comment"></span> </div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span><span class="comment">  /// Same as `Msg_mdt_out::Body`.</span></div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aad2c43c92a286ab7d186d810631a1701">  642</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aad2c43c92a286ab7d186d810631a1701">Mdt</a> = schema::detail::StructuredMessage;</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span><span class="comment"></span> </div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span><span class="comment">  /// Same as `Msg_mdt_out::Body_builder` but the `Reader` instead.</span></div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a99df8a99bc2ed106d6a03f807e6e5966">  645</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a99df8a99bc2ed106d6a03f807e6e5966">Mdt_reader</a> = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">Mdt::Reader</a>;</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span> </div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span><span class="comment"></span> </div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span><span class="comment">   * Constructs a not-ready-for-public-consumption in-message which awaits serialization-storing segments to be</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span><span class="comment">   * added via add_serialization_segment() and then finalized with deserialize_mdt() and possibly deserialize_body().</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span><span class="comment">   * After the latter 1-2: body_root() or internal_msg_body_root() can be used to access the deserialized data; as can</span></div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span><span class="comment">   * id_or_none() and similar accessors.</span></div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span><span class="comment">   *</span></div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span><span class="comment">   * @param struct_reader_config</span></div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span><span class="comment">   *        See struc::Channel ctors.  This is copied, memorized.</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span><span class="comment">   */</span></div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ae3e6be294fbff87979a407a9e971da8a">Msg_in</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">Reader_config</a>&amp; struct_reader_config);</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span> </div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span><span class="comment"></span> </div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span><span class="comment">   * Store the #Native_handle (potentially `.null()`, meaning none) in this in-message.  Call this at most once;</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment">   * or behavior undefined (assertion may trip).</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span><span class="comment">   *</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span><span class="comment">   * @param native_handle_or_null</span></div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span><span class="comment">   *        The #Native_handle (`.null() == true` if none) to move into `*this`.  Made `.null() == true` upon return.</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment">   */</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac4f7c03e1080913f949b9b24b776dc6a">store_native_handle_or_null</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>&amp;&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aba0b83c9d8a7e8f782202406ca387e2c">native_handle_or_null</a>);</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment"></span> </div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span><span class="comment">   * Prior to `deserialization_*()` obtains a memory area `max_sz` bytes long into which the user may write-to</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span><span class="comment">   * until the next add_serialization_segment(), `deserialization_*()`, or dtor call (whichever happens first);</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="comment">   * returns a pointer to that area as described by the pointed-to `Blob`&#39;s [`begin()`, `end()`) range.</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span><span class="comment">   * If the reader impl decides `max_sz` bytes are not available, returns null.  `*this` shall not be used</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span><span class="comment">   * subsequent to such an eventuality.</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span><span class="comment">   *</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span><span class="comment">   * This essentially forwards to the appropriate Struct_reader::add_serialization_segment(); hence the same</span></div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span><span class="comment">   * requirements, including w/r/t alignment and subsequent storing-into and modification of returned `Blob`,</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span><span class="comment">   * apply as described in that doc header.  That said:</span></div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span><span class="comment">   *   - The first add_serialization_segment() call must be the *sole* segment of the metadata</span></div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span><span class="comment">   *     message (corresponding to Msg_mdt_out).  After the returned `Blob` is filled-out and `.resize()`d,</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span><span class="comment">   *     you must invoke deserialize_mdt() which shall return the number of additional</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span><span class="comment">   *     add_serialization_segment() calls to make.  If that number is 0 (&lt;=&gt; id_or_none() is 0 &lt;=&gt; there is an</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span><span class="comment">   *     internal message in the Msg_mdt_out), then there shall be no further add_serialization_segment() calls;</span></div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span><span class="comment">   *     internal_msg_body_root() can be used.  Otherwise:</span></div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span><span class="comment">   *   - The following add_serialization_segment() calls (the 2nd, 3rd, ...) ones shall be, in order, comprised by</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span><span class="comment">   *     the user-message serialization (corresponding to `Msg_out&lt;Message_body&gt;`).  After each call</span></div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span><span class="comment">   *     fill-out and `.resize()` the returned `Blob`.  After the last call call deserialize_body(); then</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span><span class="comment">   *     body_root() can be used.</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span><span class="comment">   *</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment">   * @param max_sz</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment">   *        See Struct_reader::add_serialization_segment().</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">   * @return See Struct_reader::add_serialization_segment().</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">   */</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span>  flow::util::Blob* <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a3a1a75d7d7b108d46efa1892dd2571b7">add_serialization_segment</a>(<span class="keywordtype">size_t</span> max_sz);</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment"></span> </div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span><span class="comment">   * To be invoked after exactly one successful add_serialization_segment() call (and that `Blob` being filled-out</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment">   * and `.resize()`d): finalizes the deserialization of everything except the potential user-message body.</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span><span class="comment">   * This must be called strictly before any calls to internal_msg_body_root(), id_or_none(),</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment">   * originating_msg_id_or_none(), or session_token(); and any subsequent add_serialization_segment()</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">   * calls (if any).</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">   *</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span><span class="comment">   * The value this returns (sans error) dictates the exact # of further add_serialization_segment() calls to make.</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">   *   - If 0: You may use the accessor API immediately.  internal_msg_body_root() is OK; `id_or_none() == 0`;</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">   *     body_root() may not be used.</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span><span class="comment">   *   - Else: You may use the accessor API immediately.  `id_or_none() != 0`; internal_msg_body_root() may not be</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">   *     used; body_root() may not be used *yet* until successful deserialize_body().</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span><span class="comment">   *</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span><span class="comment">   * If called before add_serialization_segment(), behavior is undefined (assertion may trip).</span></div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span><span class="comment">   *</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span><span class="comment">   * If called more than once, behavior is undefined (assertion may trip).</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span><span class="comment">   *</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span><span class="comment">   * If it fails (emits truthy #Error_code), it is pointless to use `*this`.  Recommend destruction.</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span><span class="comment">   *</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span><span class="comment">   *        Logger to use for logging within this method.</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span><span class="comment">   *        Caution: Unlike user-facing methods, this does not throw (except capnp-generated exceptions);</span></div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span><span class="comment">   *        and `err_code` may not be null.  Other than that:</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span><span class="comment">   *        #Error_code generated: falsy on success, else:</span></div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span><span class="comment">   *        error::Code::S_STRUCT_CHANNEL_INTERNAL_PROTOCOL_MISUSED_SCHEMA (opposing Msg_out code</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span><span class="comment">   *        filled out the fields in an unexpected way),</span></div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span><span class="comment">   *        anything emitted by Struct_reader::deserialization().</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span><span class="comment">   */</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acd387ce27214601a70a0e1c6025075f1">deserialize_mdt</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code);</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span><span class="comment"></span> </div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span><span class="comment">   * To be invoked after `deserialize_mdt() == N`, and add_serialization_segment() was called N times (with all</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span><span class="comment">   * N `Blob`s filled-out and `.resize()`d): finalizes the deserialization of the user-message body.</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span><span class="comment">   * This must be called strictly before any calls to body_root().</span></div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span><span class="comment">   *</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span><span class="comment">   * If called before a post-deserialize_mdt() add_serialization_segment(), behavior is undefined (assertion may trip).</span></div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span><span class="comment">   *</span></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span><span class="comment">   * If called more than once, behavior is undefined (assertion may trip).</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span><span class="comment">   *</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span><span class="comment">   * If it fails (emits truthy #Error_code), it is pointless to use `*this`.  Recommend destruction.</span></div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span><span class="comment">   *</span></div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span><span class="comment">   *        See deserialize_mdt().</span></div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="comment">   */</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acc5514d773db8edb0d8d0c3d52743a6a">deserialize_body</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code);</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span><span class="comment"></span> </div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span><span class="comment">   * To be called only after deserialize_mdt(), returns the message ID of this in-message; 0 means it&#39;s an internal</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span><span class="comment">   * message (internal_msg_body_root() applies), else it&#39;s a user message (body_root() applies).</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span><span class="comment">   *</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span><span class="comment">   */</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>  <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#af7f35fc7588d97a838274fa25700ead9">msg_id_t</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad42fc6c023dae0f6bf66ffb3a3437fa4">id_or_none</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span><span class="comment"></span> </div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span><span class="comment">   * To be called only after deserialize_mdt(), returns the message ID of the out-message to which this in-message</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span><span class="comment">   * claims to be responding; or 0 if it is not a response.</span></div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span><span class="comment">   *</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span><span class="comment">   */</span></div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span>  <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#af7f35fc7588d97a838274fa25700ead9">msg_id_t</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac14e45f1df2ade79bfe525a97d65469c">originating_msg_id_or_none</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span><span class="comment"></span> </div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span><span class="comment">   * To be called only after deserialize_mdt(), similar to body_root() but for the internal-message root.</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span><span class="comment">   * See #Internal_msg_body_reader doc header.</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span><span class="comment">   *</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span><span class="comment">   */</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#afdc86a45b50e9869329b11a1e576b172">Internal_msg_body_reader</a> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a880fb3eb4b037c9a06d0a683feed660f">internal_msg_body_root</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span><span class="comment"></span> </div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span><span class="comment">   * To be called only after deserialize_mdt(), returns session token tagging this in-message.</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span><span class="comment">   *</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span><span class="comment">   */</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#a6751c05fb6582a34c7c47ac470c4a48b">Session_token</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a9bb1f48ee2a73c081cacf6c69df5a1be">session_token</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span><span class="comment"></span> </div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span><span class="comment">   * The #Mdt root capnp-generated accessor object.  May be useful for, say, pretty-printing it</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span><span class="comment">   * to log (e.g.: `capnp::prettyPrint(M.mdt_root()).flatten().cStr()`).  We do not recommend its use for</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span><span class="comment">   * other purposes; stylistically it is better to access items via individual accessors like session_token()</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span><span class="comment">   * or internal_msg_body_root().</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span><span class="comment">   *</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span><span class="comment">   */</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a99df8a99bc2ed106d6a03f807e6e5966">Mdt_reader</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a529a341e65bfb13b5a4caad131a37b0f">mdt_root</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span> </div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span><span class="comment"></span> </div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span><span class="comment">   * Same as Msg_out::Builder but the reader that can decode what that serializing `Builder` did.</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span><span class="comment">   * This deserializes the metadata and (if any) user message.</span></div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span><span class="comment">   */</span></div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad2fd47038e8a8c06aa00661a8e1e9289">  794</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad2fd47038e8a8c06aa00661a8e1e9289">Reader</a> = <span class="keyword">typename</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">Reader_config::Reader</a>;</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span> </div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span><span class="comment"></span> </div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span><span class="comment">  /// See ctor.</span></div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a7ebd1458417e3ffea3220424aacced9c">  799</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">Reader_config</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a7ebd1458417e3ffea3220424aacced9c">m_reader_config</a>;</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span><span class="comment"></span> </div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span><span class="comment">   * Deserializes the metadata sub-message, invisible to user: the thing describing the user message</span></div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span><span class="comment">   * (if any) or describing and containing the internal message (otherwise).</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span><span class="comment">   * Essentially: the first add_serialization_segment() forwards to the same</span></div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span><span class="comment">   * method on this #m_mdt_reader.  (We ensure on the opposing side the metadata structure is always 1 segment, no</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span><span class="comment">   * more.)  This stores a few things like message ID; plus possibly an internal-body; otherwise the #</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="comment">   * of times add_serialization_segment() must be called to complete #m_body_reader serialization.  In the former</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="comment">   * case #m_body_reader is left null: there is no user message.</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span><span class="comment">   *</span></div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span><span class="comment">   * deserialize_mdt() forwards to `.deserialization()` on #m_mdt_reader.  Then the post-deserialization accessors</span></div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span><span class="comment">   * become available except body_root().</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span><span class="comment">   */</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6fd10709650b97357f05bf9cf402c10e">  813</a></span>  std::optional&lt;Reader&gt; <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6fd10709650b97357f05bf9cf402c10e">m_mdt_reader</a>;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span><span class="comment"></span> </div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span><span class="comment">   * Like #m_mdt_reader but for the user message if any.  Essentially: the 2nd, 3rd, ... add_serialization_segment()</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span><span class="comment">   * forward to the same method on this #m_body_reader.  This stores the user-message payload if any.  If none this</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span><span class="comment">   * is left null: there is no user message.</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span><span class="comment">   *</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span><span class="comment">   * deserialize_body() forwards to the same method on #m_body_reader.  Then body_root() becomes available.</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span><span class="comment">   */</span></div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af29e72cdaf6edd4f0124bc9fe0c46592">  822</a></span>  std::optional&lt;Reader&gt; <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af29e72cdaf6edd4f0124bc9fe0c46592">m_body_reader</a>;</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span><span class="comment"></span> </div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span><span class="comment">  /// Starts `false`; becomes `true` immutably once deserialize_mdt() succeeds.</span></div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4733178dead33f39d8f3bf60faef4723">  825</a></span><span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4733178dead33f39d8f3bf60faef4723">m_mdt_deserialized_ok</a>;</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span><span class="comment"></span> </div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span><span class="comment">  /// Starts `false`; becomes `true` immutably once deserialize_body() succeeds (never if it&#39;s an internal message).</span></div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af501f959aded43b1777937c895b92f5b">  828</a></span><span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af501f959aded43b1777937c895b92f5b">m_body_deserialized_ok</a>;</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span><span class="comment"></span> </div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span><span class="comment">  /// See internal_msg_body_root(); meaningless until #m_mdt_deserialized_ok.</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a198052c9afc3f0f2727dd38214169b2b">  831</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a99df8a99bc2ed106d6a03f807e6e5966">Mdt_reader</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a198052c9afc3f0f2727dd38214169b2b">m_mdt_root</a>;</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span><span class="comment"></span> </div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span><span class="comment">  /// See body_root(); meaningless until #m_body_deserialized_ok.</span></div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a8dbe5e947bef497468ff8fc84090b398">  834</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6e21b165a0673138db44d86584dd5059">Body_reader</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a8dbe5e947bef497468ff8fc84090b398">m_body_root</a>;</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span><span class="comment"></span> </div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span><span class="comment">   * Starts uninitialized, this is assigned exactly once by deserialize_mdt(), storing the session-token that</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span><span class="comment">   * was embedded in the in-message.  This is cached from the encoding in the tree accessed via #m_mdt_root.</span></div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span><span class="comment">   * It is cached for session_token() perf only.</span></div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span><span class="comment">   */</span></div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa4c99d20d237670ba77769e721891b4b">  841</a></span>  <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#a6751c05fb6582a34c7c47ac470c4a48b">Session_token</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa4c99d20d237670ba77769e721891b4b">m_session_token</a>;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span><span class="comment"></span> </div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span><span class="comment">  /// See store_native_handle_or_null().</span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a62c9c5fe295e00fc7672a7d256ec28f1">  844</a></span><span class="comment"></span>  <a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a62c9c5fe295e00fc7672a7d256ec28f1">m_hndl_or_null</a>;</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span>}; <span class="comment">// class Msg_in</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span> </div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span><span class="comment">// Free functions: in *_fwd.hpp.</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span> </div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span><span class="comment">// Template implementations.</span></div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span><span class="comment"></span> </div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"><a class="line" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">  852</a></span><span class="comment"></span><span class="preprocessor">#define TEMPLATE_STRUCT_MSG_OUT \</span></div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span><span class="preprocessor">  template&lt;typename Message_body, typename Struct_builder_t&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"><a class="line" href="msg_8hpp.html#af8ab263935b3bae1c9ee6355a55fa94a">  855</a></span><span class="comment"></span><span class="preprocessor">#define CLASS_STRUCT_MSG_OUT \</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span><span class="preprocessor">  Msg_out&lt;Message_body, Struct_builder_t&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"><a class="line" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">  858</a></span><span class="comment"></span><span class="preprocessor">#define TEMPLATE_STRUCT_MSG_IN \</span></div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span><span class="preprocessor">  template&lt;typename Message_body, typename Struct_reader_config&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"><a class="line" href="msg_8hpp.html#a679f25e8d9dc9d3ad750442e92b640f0">  861</a></span><span class="comment"></span><span class="preprocessor">#define CLASS_STRUCT_MSG_IN \</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span><span class="preprocessor">  Msg_in&lt;Message_body, Struct_reader_config&gt;</span></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span> </div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span><span class="comment">// Msg_out template implementations.</span></div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span> </div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9289790ac6b85681c8697fc55ff8f3a7">  867</a></span>CLASS_STRUCT_MSG_OUT::Msg_out() :</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span>  m_body_root(nullptr) <span class="comment">// capnp deletes default ctor to &quot;discourage incorrect usage&quot; but makes this available.</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span>{</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>  <span class="comment">// OK then.  Useless *this until moved-to.</span></div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span>}</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span> </div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9d4ab66d2740f40a88f476d46dd04f1e">  874</a></span>CLASS_STRUCT_MSG_OUT::Msg_out</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span>  (<span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a0e66b941a2b67ec21087581d1e44f42b">Builder_config</a>&amp; struct_builder_config) :</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span> </div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span>  <span class="comment">/* As promised, in this simple (typical) form we create the new capnp::MessageBuilder and initRoot&lt;Body&gt;() it</span></div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span><span class="comment">   * for them.  Simply delegating as follows causes getRoot&lt;Body&gt;() to act as-if initRoot&lt;Body&gt;() due to lacking</span></div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span><span class="comment">   * an initialized root at that point. */</span></div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span>  <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>(<a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">Builder</a>(struct_builder_config))</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span>{</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span>  <span class="comment">// OK then.  Mutate away, user.</span></div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span>}</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span> </div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9738acbcfb431dc1fc0174b42787060b">  886</a></span>CLASS_STRUCT_MSG_OUT::Msg_out(<a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">Builder</a>&amp;&amp; struct_builder) :</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span> </div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span>  <span class="comment">/* In this more advanced (from user&#39;s PoV) ctor form they already are giving us m_builder and guaranteeing</span></div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span><span class="comment">   * its getRoot&lt;Body&gt;() is either already a thing... or it is not root-initialized at all.</span></div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span><span class="comment">   * getRoot&lt;Body&gt;() by us will thus not modify the tree, if it is initialized; or create a blank tree</span></div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span><span class="comment">   * (same as the other ctor), if it is not.  The only problematic situation -- as advertised -- is</span></div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span><span class="comment">   * if they root-initialized it to something other than Body (e.g., initRoot&lt;SomeOtherThing&gt;()); then getRoot&lt;Body&gt;()</span></div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span><span class="comment">   * will try to treat non-Body as Body, and something will probably blow up at some point</span></div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span><span class="comment">   * (possibly during deserialization). */</span></div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>  m_builder(std::move(struct_builder)), <span class="comment">// Eat theirs!</span></div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span>  m_body_root(m_builder.payload_msg_builder()-&gt;template getRoot&lt;<a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aab352abf2ced76f2bad6700d75290132">Body</a>&gt;()) <span class="comment">// Pluck out theirs, or initialize if needed!</span></div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span>{</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span>  <span class="comment">// OK then.  Mutate away, user (though they may well have finalized m_body_root tree already).</span></div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>}</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span> </div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a50c8fd96304e09aaf9bbacd9959c07d6">  902</a></span>CLASS_STRUCT_MSG_OUT::Msg_out(<a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;&amp; src) :</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span>  <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>()</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span>{</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6a9b086eedafe0a5fc71695812677cdb">operator=</a>(std::move(src));</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span>  <span class="comment">/* (This comment is by ygoldfel, original author of this code -- here and all of this class template and file.)</span></div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span><span class="comment">   * This implementation is clearly correct (functionally); one can see a similar pattern used in many places in,</span></div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span><span class="comment">   * e.g., STL/Boost.  However the original, and all else being equal (which it&#39;s not; read on), my preferred</span></div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span><span class="comment">   * implementation of this move ctor is simply: `= default;`.  In that original state I tested this guy and</span></div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span><span class="comment">   * ran into the following.</span></div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno">  912</span><span class="comment">   *</span></div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span><span class="comment">   * As of this writing, to test this (and all of Msg_out and much else besides), I&#39;ve been using the</span></div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span><span class="comment">   * transport_test.exec exercise-mode section; and the unit_test.exec test suite (both in the `ipc` meta-project,</span></div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span><span class="comment">   * though most of the relevant .../test/... code for unit_test.exec is in `ipc_shm_arena_lend` project therein).</span></div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span><span class="comment">   * (Normally we don&#39;t speak of test code inside source code proper like this, but read on to see why the</span></div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span><span class="comment">   * exception.)  transport_test has passed in all configurations (build/run envs) without issue.</span></div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span><span class="comment">   * unit_test.exec has passed in at least the following (all Linux) except the *asterisked* one:</span></div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span><span class="comment">   *   - gcc-9, -O0 or: (-O3 + LTO disabled or LTO (with fat-object-generation on) enabled (for all of libflow</span></div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span><span class="comment">   *     and libipc_* and the test code proper)).</span></div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span><span class="comment">   *   - clang-17 + libc++ (LLVM-10) (note: not GNU stdc++), -O0 or: (-O3 + LTO disabled or LTO (-flto=thin) enabled*</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span><span class="comment">   *     (for all of libflow and libipc_* and the test code proper)).</span></div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span><span class="comment">   *</span></div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span><span class="comment">   * The *asterisk* there denotes the one config where a problem was observed.  Namely,</span></div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span><span class="comment">   * Shm_session_test.In_process_array unit_test failed, seg-faulting before the test could complete (no actual</span></div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno">  926</span><span class="comment">   * test-failed assertions had triggered up to the seg-fault point).  The seg-fault was completely consistent</span></div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span><span class="comment">   * (at least given a particular machine): in session::Client_session_impl::mdt_builder(), just near the end</span></div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span><span class="comment">   * of the method, a Msg_out was being move-cted (presumably using this ctor here) from another Msg_out</span></div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span><span class="comment">   * that had just been constructed a few lines above.  Granted, that source Msg_out was constructed and</span></div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span><span class="comment">   * populated (rather straightforwardly) in another thread, but a synchronization mechanism was used to ensure</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span><span class="comment">   * this happened synchronously before the code that seg-faulted (this move-ctor) would proceed to be called.</span></div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span><span class="comment">   * (I verified quite studiously that nothing untoward was happening there; clearly the source object was</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span><span class="comment">   * created cleanly before signaling the thread waiting to proceed with this move-ct to quit waiting and proceed.)</span></div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span><span class="comment">   * (In addition note that this Msg_out ctor was, as seen in debugger, clearly getting auto-inlined; since the prob</span></div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span><span class="comment">   * occurred with LTO but not without -- though gcc&#39;s LTO had no issue, but I digress -- this may be significant.)</span></div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span><span class="comment">   *</span></div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span><span class="comment">   * First I labored to isolate where the problem occurred; there was no corrupted memory or anything strange like</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span><span class="comment">   * that; and it fairly clearly really was in the move ctor (which, again, was just `= default;` at the time).</span></div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span><span class="comment">   * Since the move ctor was auto-generated, it was somewhat challenging to see where the problem happened, though</span></div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span><span class="comment">   * admittedly due to time pressure I did not delve into the move ctors *that* would&#39;ve invoked: for</span></div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span><span class="comment">   * m_builder, m_body_root, m_hndl_or_null (doing so might be a good idea; but keep reading).</span></div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span><span class="comment">   *</span></div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span><span class="comment">   * At that point, just to see what&#39;s up, I &quot;jiggled&quot; the implementation into its current form.  Empirically</span></div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span><span class="comment">   * speaking the problem went away, and everything passed swimmingly with no instability.  Hence I left the</span></div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span><span class="comment">   * work-around in place.  So where does it leave us?</span></div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span><span class="comment">   *</span></div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span><span class="comment">   * 1, in terms of correctness and generated-code quality: As noted, the new impl is clearly correct.  In terms of</span></div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span><span class="comment">   * generated-code quality, it is potentially a few instructions slower than the auto-generated ctor:</span></div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span><span class="comment">   * the three m_* are first initialized to their null states and then move-assigned; plus</span></div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><span class="comment">   * store_native_handle_or_null() checks m_hndl_or_null for null (which it is, so that `if` no-ops).</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno">  951</span><span class="comment">   * It&#39;s simple/quick stuff, and it might even get optimized away with -O3, but nevertheless skipping to</span></div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span><span class="comment">   * move-ction of the members would be more certain to not do that unneeded zeroing stuff.  Subjectively: it&#39;s</span></div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span><span class="comment">   * probably fine (undoubtedly there are far heavier perf concerns than a few extra zeroings).</span></div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span><span class="comment">   *</span></div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span><span class="comment">   * 2, there&#39;s the mystery.  I.e., sure, the replacement code is fine and is unlikely to be a perf problem;</span></div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span><span class="comment">   * but why isn&#39;t the preferred `= default;` the one in actual use?  Why did it cause the failure, though only</span></div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span><span class="comment">   * in a very particular build/run environment (clang-17, LLVM-10 libc++, with thin-LTO), when similar ones</span></div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span><span class="comment">   * (such as same but without LTO) were fine?  At this stage I honestly do not know and will surely file a</span></div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span><span class="comment">   * ticket to investigate/solve.  Briefly the culprit candidates are:</span></div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span><span class="comment">   *   - Msg_out code itself.  Is there some unseen uninitialized datum?  Some basic assumption being ignored or</span></div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span><span class="comment">   *     C++ rule being broken? ###</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span><span class="comment">   *   - Something in capnp-generated move-ctor (as of this writing capnp version = 1.0.1, from late 2023) or</span></div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno">  963</span><span class="comment">   *     m_builder move-ctor.</span></div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span><span class="comment">   *   - Something in clang-17 + thin-LTO optimizer improperly reordering instructions.</span></div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span><span class="comment">   *</span></div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span><span class="comment">   * I cannot speculate much about which it is; can only say after a few hours of contemplating possibilities:</span></div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span><span class="comment">   * no candidates for ### (see above) being at fault has jumped out at me.  That said, no run-time sanitizer</span></div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span><span class="comment">   * has run through this code as of this writing (though the code analyzer, Coverity, has not complained);</span></div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span><span class="comment">   * that could help.  Sanitizer or not, generally:</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span><span class="comment">   * given 0-2 days of investigation by an experienced person surely we can narrow this down to a</span></div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno">  971</span><span class="comment">   * minimal repro case, etc. etc.  So it is solvable: just needs to be done.</span></div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span><span class="comment">   *</span></div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span><span class="comment">   * Until then: (1) this remains a mystery; and (2) there is an acceptable work-around.  (Though the mystery</span></div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span><span class="comment">   * is personally disconcerting to me; e.g., as of this writing, I cannot name another such mystery in this</span></div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span><span class="comment">   * entire code base.) */</span></div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span>} <span class="comment">// CLASS_STRUCT_MSG_OUT::Msg_out(Msg_out&amp;&amp;)</span></div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno">  977</span> </div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6fe17e3ce3e3569e7b08538f525918e9">  979</a></span>CLASS_STRUCT_MSG_OUT::~Msg_out()</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span>{</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno">  981</span>  <span class="comment">// As promised return it (if any) to OS.</span></div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span>  store_native_handle_or_null(<a class="code hl_typedef" href="namespaceipc_1_1transport.html#a7ee4551983d9df16ec16a3139bac50e8">Native_handle</a>());</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span> </div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span>  <span class="comment">// The rest of cleanup is automatic.</span></div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span>}</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span> </div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno">  987</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6a9b086eedafe0a5fc71695812677cdb">  988</a></span><a class="code hl_define" href="msg_8hpp.html#af8ab263935b3bae1c9ee6355a55fa94a">CLASS_STRUCT_MSG_OUT</a>&amp; CLASS_STRUCT_MSG_OUT::operator=(<a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>&amp;&amp; src)</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno">  989</span>{</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span>  m_builder = std::move(src.m_builder);</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span> </div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span>  <span class="comment">/* I was a bit worried about this (and note this of course similarly auto-occurs in the =default-ed move ctor) but</span></div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span><span class="comment">   * I (ygoldfel) did some due diligence on it:</span></div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span><span class="comment">   *   - It is after all move()able (or this wouldn&#39;t compile), with implicitly-default move ops.</span></div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span><span class="comment">   *     This doesn&#39;t &quot;nullify&quot; src.m_body_root, but that is perfectly fine; m_builder sure is made as-if</span></div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span><span class="comment">   *     default-cted, and anyway using (other than move-to) of a moved-from `*this` is advertised as undefined</span></div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span><span class="comment">   *     behavior.</span></div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span><span class="comment">   *   - `Builder`s are generally treated as light-weight in capnp docs.</span></div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno">  999</span><span class="comment">   *  - Looking inside the current (version 0.10) code shows that a capnp-`struct` Builder is, internally,</span></div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span><span class="comment">   *    entirely consisting of something called StructBuilder, and the latter consists of 4 pointers and 2</span></div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span><span class="comment">   *    integers.</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment">   * So it is fine (and so is the move ctor). */</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span>  m_body_root = std::move(src.m_body_root);</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> </div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span>  <span class="comment">// The following is why we didn&#39;t simply do =default.</span></div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span>  <span class="keywordflow">if</span> (m_hndl_or_null != src.m_hndl_or_null)</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span>  {</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span>    <span class="comment">// As promised return it (if any) to OS, as that is what would happen if *this were destroyed.</span></div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span>    store_native_handle_or_null(<a class="code hl_typedef" href="namespaceipc_1_1transport.html#a7ee4551983d9df16ec16a3139bac50e8">Native_handle</a>());</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span>  }</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> </div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span>  m_hndl_or_null = std::move(src.m_hndl_or_null);</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> </div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span>} <span class="comment">// Msg_out::operator=(move)</span></div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> </div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9894ad7ec2a46641c4b9b86664d0d465"> 1018</a></span><span class="keyword">typename</span> CLASS_STRUCT_MSG_OUT::Body_builder* CLASS_STRUCT_MSG_OUT::body_root()</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span>{</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span>  <span class="keywordflow">return</span> &amp;m_body_root;</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span>}</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> </div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a66eade858d6b311d6e2d633b43ee71ad"> 1024</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_STRUCT_MSG_OUT::Body_builder* CLASS_STRUCT_MSG_OUT::body_root()<span class="keyword"> const</span></div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1Msg__out.html">Msg_out</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;body_root();</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span>}</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9303c71f8f459ede25ebe0c8f5492393"> 1030</a></span><span class="keyword">typename</span> CLASS_STRUCT_MSG_OUT::Orphanage CLASS_STRUCT_MSG_OUT::orphanage()</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span>{</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span>  <span class="keywordflow">return</span> m_builder.payload_msg_builder()-&gt;getOrphanage();</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span>  <span class="comment">/* Aside: Per capnp docs (&quot;C++ serialization&quot;) one can also do:</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span><span class="comment">   *   return ::capnp::Orphanage::getForMessageContaining(*(body_root())); */</span></div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span>}</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> </div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aced8ef8237617c74aaf06832d1385fed"> 1038</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_OUT::store_native_handle_or_null (<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>&amp;&amp; native_handle_or_null)</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span>{</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span>  <span class="keywordflow">if</span> (native_handle_or_null == m_hndl_or_null)</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span>  {</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span>  }</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordflow">if</span> (!m_hndl_or_null.null())</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span>  {</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span>    <a class="code hl_function" href="namespaceipc_1_1transport_1_1asio__local__stream__socket.html#af0833f160dffd7f1c6921d27883a186b">asio_local_stream_socket::release_native_peer_socket</a>(std::move(m_hndl_or_null)); <span class="comment">// OK if it is .null().</span></div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span>  }</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span>  m_hndl_or_null = std::move(native_handle_or_null);</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span>}</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> </div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#ae033461f1404be60262033bafcfaccba"> 1053</a></span><a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> CLASS_STRUCT_MSG_OUT::native_handle_or_null()<span class="keyword"> const</span></div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">return</span> m_hndl_or_null;</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span>}</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> </div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a91d2575343b28f83e22a71e7f7b3ff40"> 1059</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_OUT::emit_serialization(<a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#a82a69eaa39cbe8a002de1266f1cbb5cb">Segment_ptrs</a>* target_blobs, <span class="keyword">const</span> <span class="keyword">typename</span> Builder::Session&amp; session,</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span>                                              <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span>  m_builder.emit_serialization(target_blobs, session, err_code); <span class="comment">// Let it emit error or not.</span></div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span>}</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> </div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#adb630aeb1bb9e9335631f9e9e6dc25de"> 1066</a></span><span class="keywordtype">size_t</span> CLASS_STRUCT_MSG_OUT::n_serialization_segments()<span class="keyword"> const</span></div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span>  <span class="keywordflow">return</span> m_builder.n_serialization_segments();</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span>}</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> </div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a754e0f025f471105d52b3b090c27f1c0"> 1072</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_OUT::to_ostream(std::ostream* os_ptr)<span class="keyword"> const</span></div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a>;</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> </div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span>  <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> MAX_SZ = 256;</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span>  <span class="keyword">constexpr</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">String_view</a> TRUNC_SUFFIX = <span class="stringliteral">&quot;... )&quot;</span>; <span class="comment">// Fake the end to look like the end of the real pretty-print.</span></div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> </div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span>  <span class="keyword">auto</span>&amp; os = *os_ptr;</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> </div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span>  <span class="comment">// This is not a public API but OK to output publicly methinks.</span></div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span>  os &lt;&lt; <span class="stringliteral">&quot;[n_serialization_segs[&quot;</span> &lt;&lt; n_serialization_segments() &lt;&lt; <span class="stringliteral">&quot;] &quot;</span>;</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> </div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span>  <span class="keyword">const</span> <span class="keyword">auto</span> hndl_or_null = native_handle_or_null();</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span>  <span class="keywordflow">if</span> (!hndl_or_null.null())</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span>  {</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span>    <span class="comment">// As of this writing it&#39;s, like, &quot;native_hndl[&lt;the FD&gt;]&quot; -- that looks pretty good and pithy.</span></div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span>    os &lt;&lt; hndl_or_null &lt;&lt; <span class="charliteral">&#39; &#39;</span>;</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span>  }</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span>  <span class="comment">// else { No need to output anything; pithier. }</span></div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> </div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span>  <span class="comment">/* prettyPrint() gives an indented multi-line version; this gives a single-line one.  Seems there&#39;s no way to</span></div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span><span class="comment">   * truncate it &quot;on the fly&quot;; a full-printout string must be made first (which is too bad; @todo revisit). */</span></div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span>  <span class="keyword">const</span> kj::String capnp_str = kj::str(*(body_root()));</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span>  <span class="keywordflow">if</span> (capnp_str.size() &gt; MAX_SZ)</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span>  {</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span>    os &lt;&lt; <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">String_view</a>(capnp_str.begin(), MAX_SZ - TRUNC_SUFFIX.size()) &lt;&lt; TRUNC_SUFFIX;</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span>  }</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span>  {</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span>    os &lt;&lt; capnp_str.cStr();</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span>  }</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> </div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span>  os &lt;&lt; <span class="stringliteral">&quot;]@&quot;</span> &lt;&lt; <span class="keyword">this</span>;</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span>} <span class="comment">// Msg_out::to_ostream()</span></div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> </div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span><a class="code hl_define" href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a134e737e55ae825527efd6a9e68bf37e"> 1108</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1transport_1_1struc.html#ae272f248d74db0486c4d9411715db15d">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_define" href="msg_8hpp.html#af8ab263935b3bae1c9ee6355a55fa94a">CLASS_STRUCT_MSG_OUT</a>&amp; val)</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span>{</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span>  val.to_ostream(&amp;os);</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span>}</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> </div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span><span class="comment">// Msg_in template implementations.</span></div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> </div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ae3e6be294fbff87979a407a9e971da8a"> 1117</a></span>CLASS_STRUCT_MSG_IN::Msg_in(<span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">Reader_config</a>&amp; struct_reader_config) :</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span>  m_reader_config(struct_reader_config),</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span>  m_mdt_deserialized_ok(false),</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span>  m_body_deserialized_ok(false)</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span>  <span class="comment">// m_session_token is uninitialized garbage.</span></div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span>{</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span>  <span class="comment">// That&#39;s it: need to feed segments into m_*_reader before can deserialize anything.</span></div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span>}</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> </div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac4f7c03e1080913f949b9b24b776dc6a"> 1127</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_IN::store_native_handle_or_null(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>&amp;&amp; native_handle_or_null)</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span>{</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span>  assert(m_hndl_or_null.null() &amp;&amp; <span class="stringliteral">&quot;Call this at most once (probably upon finalizing 1st segment as well).&quot;</span>);</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span>  m_hndl_or_null = std::move(native_handle_or_null);</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span>}</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> </div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span>CLASS_STRUCT_MSG_IN::~Msg_in() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> </div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a3a1a75d7d7b108d46efa1892dd2571b7"> 1138</a></span>flow::util::Blob* CLASS_STRUCT_MSG_IN::add_serialization_segment(<span class="keywordtype">size_t</span> max_sz)</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span>{</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span>  <span class="keyword">using </span>boost::movelib::make_unique;</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> </div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span>  assert((!m_body_deserialized_ok)</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span>         &amp;&amp; <span class="stringliteral">&quot;Do not call add_serialization_segment() after both deserialize_*().&quot;</span>);</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> </div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span>  <span class="comment">// Fill them out in the order described in their doc headers.</span></div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> </div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span>  <span class="keywordflow">if</span> (!m_mdt_reader)</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span>  {</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span>    m_mdt_reader.emplace(m_reader_config);</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span>    <span class="keywordflow">return</span> m_mdt_reader-&gt;add_serialization_segment(max_sz);</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span>  }</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span>  <span class="keywordflow">if</span> (!m_body_reader)</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span>  {</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span>    m_body_reader.emplace(m_reader_config);</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span>  }</div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span>  <span class="keywordflow">return</span> m_body_reader-&gt;add_serialization_segment(max_sz);</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span>} <span class="comment">// Msg_in::add_serialization_segment()</span></div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> </div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acd387ce27214601a70a0e1c6025075f1"> 1161</a></span><span class="keywordtype">size_t</span> CLASS_STRUCT_MSG_IN::deserialize_mdt(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span>{</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a>;</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span>  <span class="keyword">using </span>boost::endian::little_to_native;</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> </div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span>  assert(err_code);</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span>  assert((!m_mdt_deserialized_ok) &amp;&amp; <span class="stringliteral">&quot;Do not call deserialize_mdt() after it returns.&quot;</span>);</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span>  assert(m_mdt_reader &amp;&amp; <span class="stringliteral">&quot;Must call add_serialization_segment() exactly 1x before deserialize_mdt().&quot;</span>);</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> </div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span>  m_mdt_root = m_mdt_reader-&gt;template deserialization&lt;Mdt&gt;(err_code);</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span>  <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span>  {</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span>    <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span>  }</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span>  <span class="comment">// else: Now the accessors will work (including for us below).</span></div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span>  m_mdt_deserialized_ok = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> </div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span>  FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT); <span class="comment">// Log on errors (at least).</span></div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> </div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span>  <span class="comment">/* Refer to structured_msg.capnp StructuredMessage.  m_mdt_reader has initialized it for us.  Now to fill it in:</span></div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span><span class="comment">   * Let&#39;s go over it:</span></div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span><span class="comment">   *   - authHeader.sessionToken: We decode it here and save it (for accessor perf).</span></div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span><span class="comment">   *   - id: It&#39;s accessible through accessor id_or_none() (perf is good enough to not need caching).</span></div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span><span class="comment">   *     However we check it for correctness and emit error if bad.</span></div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span><span class="comment">   *   - originatingMessageOrNull: Basically there&#39;s a msg_id_t in there too (ditto, originating_msg_id_or_none()).</span></div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span><span class="comment">   *     However we check it for correctness and emit error if bad.</span></div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span><span class="comment">   *   - internalMessageBody: Present if and only if there will be no m_body_reader. */</span></div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> </div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span>  <span class="comment">// Deal with sessionToken.  Decode as mandated in .capnp Uuid doc header.  @todo Factor this out into a util method.</span></div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> </div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span>  <span class="comment">// Error helper.</span></div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span>  <span class="keyword">const</span> <span class="keyword">auto</span> error_out = [&amp;](<a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">String_view</a> msg) -&gt; <span class="keywordtype">size_t</span></div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span>  {</div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span>    *err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1struc_1_1error.html#a990b9ff850cf9aaf354efdd07d86a71da26ab25e100104aeb567d90f794313e3b">error::Code::S_STRUCT_CHANNEL_INTERNAL_PROTOCOL_MISUSED_SCHEMA</a>;</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span>    FLOW_LOG_WARNING(msg);</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span>    m_mdt_deserialized_ok = <span class="keyword">false</span>; <span class="comment">// Mark us as failed again.</span></div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span>    <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span>  }; <span class="comment">// const auto error_out =</span></div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> </div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span>  <span class="keywordflow">if</span> (!m_mdt_root.hasAuthHeader())</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span>  {</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span>    <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message has null .authHeader.  Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span>  }</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span>  <span class="keyword">const</span> <span class="keyword">auto</span> auth_header = m_mdt_root.getAuthHeader();</div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> </div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span>  <span class="keywordflow">if</span> (!auth_header.hasSessionToken())</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span>  {</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span>    <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message has null .authHeader.  Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span>  }</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> </div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span>  <span class="keyword">const</span> <span class="keyword">auto</span> capnp_uuid = auth_header.getSessionToken();</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span>  <span class="keyword">static_assert</span>(<span class="keyword">decltype</span>(m_session_token)::static_size() == 2 * <span class="keyword">sizeof</span>(uint64_t),</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span>                <span class="stringliteral">&quot;World is broken: UUIDs expected to be 16 bytes!&quot;</span>);</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span>  <span class="keyword">auto</span>&amp; first8 = *(<span class="keyword">reinterpret_cast&lt;</span>uint64_t*<span class="keyword">&gt;</span>(m_session_token.data())); <span class="comment">// m_session_token is aligned, so this is too.</span></div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span>  <span class="keyword">auto</span>&amp; last8 = *(<span class="keyword">reinterpret_cast&lt;</span>uint64_t*<span class="keyword">&gt;</span>(m_session_token.data() + <span class="keyword">sizeof</span>(uint64_t))); <span class="comment">// As is this.</span></div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span>  first8 = little_to_native(capnp_uuid.getFirst8()); <span class="comment">// Reminder: Likely no-op + copy of uint64_t.</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span>  last8 = little_to_native(capnp_uuid.getLast8()); <span class="comment">// Ditto.</span></div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> </div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span>  <span class="comment">// As planned check .originatingMessageOrNull for basic correctness.</span></div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (m_mdt_root.hasOriginatingMessageOrNull() &amp;&amp; (originating_msg_id_or_none() == 0))</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span>  {</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span>    <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message top union specifies .originatingMessageOrNull.id but it is 0.  Responses to &quot;</span></div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span>                     <span class="stringliteral">&quot;internal messages (with .id=sentinel) are not allowed.  Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span>  }</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span>  <span class="comment">// else: no problem there.</span></div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> </div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span>  <span class="keyword">const</span> <span class="keyword">auto</span> id_or_0 = id_or_none();</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span>  <span class="keywordflow">if</span> (m_mdt_root.isInternalMessageBody())</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span>  {</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span>    <span class="keywordflow">if</span> (id_or_0 != 0)</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span>    {</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span>      <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message top union specifies .internalMessageBody; but .id=/=0, the sentinel value.  &quot;</span></div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span>                       <span class="stringliteral">&quot;Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span>    }</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> </div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span>    <span class="comment">/* And that&#39;s that.  Stuff like IDs may still be wrong compared to preceding messages, which we can&#39;t check yet.</span></div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span><span class="comment">     * struc::Channel will before any emission to user. */</span></div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span>    assert(!*err_code);</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span>    <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span>  }</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span>  <span class="comment">// else if (!.isInternalMessageBody())</span></div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> </div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span>  <span class="keywordflow">if</span> (id_or_0 == 0)</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span>  {</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span>    <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message top union specifies no .internalMessageBody; but .id=0, the sentinel value.  &quot;</span></div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span>                     <span class="stringliteral">&quot;Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span>  }</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> </div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> n_body_segs = m_mdt_root.getNumBodySerializationSegments();</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordflow">if</span> (n_body_segs == 0)</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span>  {</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span>    <span class="keywordflow">return</span> error_out(<span class="stringliteral">&quot;In-mdt-message top union specifies no .internalMessageBody; and .id=0, the sentinel value; &quot;</span></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span>                     <span class="stringliteral">&quot;but body-segment-count is 0 which is illegal.  Other side misbehaved?&quot;</span>);</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span>  }</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> </div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span>  <span class="comment">// And that&#39;s that.  (Same comment as above.)</span></div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordflow">return</span> n_body_segs;</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span>} <span class="comment">// Msg_in::deserialize_mdt()</span></div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> </div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acc5514d773db8edb0d8d0c3d52743a6a"> 1266</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_IN::deserialize_body(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span>{</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span>  assert(err_code);</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Do not call deserialize_body() until deserialize_mdt() succeeds.&quot;</span>);</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span>  assert((id_or_none() != 0) &amp;&amp; <span class="stringliteral">&quot;Do not call deserialize_body() on internal messages.&quot;</span>);</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span>  assert((!m_body_deserialized_ok) &amp;&amp; <span class="stringliteral">&quot;Do not call deserialize_body() after it returns.&quot;</span>);</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span>  assert(m_body_reader &amp;&amp; <span class="stringliteral">&quot;Must call add_serialization_segment() at least once after deserialize_mdt() but before &quot;</span></div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span>                          <span class="stringliteral">&quot;deserialize_body().&quot;</span>);</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> </div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span>  m_body_root = m_body_reader-&gt;template deserialization&lt;Body&gt;(err_code);</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span>  <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span>  {</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span>  }</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span>  <span class="comment">// else: Now body_root() works.</span></div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span>  m_body_deserialized_ok = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span>} <span class="comment">// Msg_in::deserialize_body()</span></div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> </div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad42fc6c023dae0f6bf66ffb3a3437fa4"> 1285</a></span><a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#af7f35fc7588d97a838274fa25700ead9">msg_id_t</a> CLASS_STRUCT_MSG_IN::id_or_none()<span class="keyword"> const</span></div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_mdt() successfully before calling accessors.&quot;</span>);</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span>  <span class="keywordflow">return</span> m_mdt_root.getId();</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span>}</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> </div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac14e45f1df2ade79bfe525a97d65469c"> 1292</a></span><a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#af7f35fc7588d97a838274fa25700ead9">msg_id_t</a> CLASS_STRUCT_MSG_IN::originating_msg_id_or_none()<span class="keyword"> const</span></div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_mdt() successfully before calling accessors.&quot;</span>);</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span>  <span class="keywordflow">return</span> m_mdt_root.hasOriginatingMessageOrNull()</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span>           ? m_mdt_root.getOriginatingMessageOrNull().getId()</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span>           : 0;</div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span>}</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> </div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a9bb1f48ee2a73c081cacf6c69df5a1be"> 1301</a></span><span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc.html#a6751c05fb6582a34c7c47ac470c4a48b">Session_token</a>&amp; CLASS_STRUCT_MSG_IN::session_token()<span class="keyword"> const</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_mdt() successfully before calling accessors.&quot;</span>);</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span>  <span class="keywordflow">return</span> m_session_token;</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span>}</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> </div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a880fb3eb4b037c9a06d0a683feed660f"> 1308</a></span><span class="keyword">typename</span> CLASS_STRUCT_MSG_IN::Internal_msg_body_reader CLASS_STRUCT_MSG_IN::internal_msg_body_root()<span class="keyword"> const</span></div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_mdt() successfully before calling accessors.&quot;</span>);</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span>  assert((!m_body_reader) &amp;&amp; <span class="stringliteral">&quot;Access internal_msg_body_root() only if `id_or_none() == 0`.&quot;</span>);</div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordflow">return</span> m_mdt_root.getInternalMessageBody();</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span>}</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> </div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a56fa38feb9c907ae3f0f1a6ff16dd32f"> 1316</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_STRUCT_MSG_IN::Body_reader&amp; CLASS_STRUCT_MSG_IN::body_root()<span class="keyword"> const</span></div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span>  assert(m_body_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_body() successfully before calling body_root() accessor.&quot;</span>);</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordflow">return</span> m_body_root;</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span>}</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> </div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a529a341e65bfb13b5a4caad131a37b0f"> 1323</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_STRUCT_MSG_IN::Mdt_reader&amp; CLASS_STRUCT_MSG_IN::mdt_root()<span class="keyword"> const</span></div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span>  assert(m_mdt_deserialized_ok &amp;&amp; <span class="stringliteral">&quot;Call deserialize_mdt() successfully before calling mdt_root() accessor.&quot;</span>);</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span>  <span class="keywordflow">return</span> m_mdt_root;</div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span>}</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> </div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aba0b83c9d8a7e8f782202406ca387e2c"> 1330</a></span><a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> CLASS_STRUCT_MSG_IN::native_handle_or_null()<span class="keyword"> const</span></div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordflow">return</span> m_hndl_or_null;</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span>}</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> </div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4783bd852b1dcba1542e0cfe37205e9e"> 1336</a></span><span class="keywordtype">void</span> CLASS_STRUCT_MSG_IN::to_ostream(std::ostream* os_ptr)<span class="keyword"> const</span></div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a>;</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> </div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span>  <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> MAX_SZ = 256;</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span>  <span class="keyword">constexpr</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">String_view</a> TRUNC_SUFFIX = <span class="stringliteral">&quot;... )&quot;</span>; <span class="comment">// Fake the end to look like the end of the real pretty-print.</span></div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> </div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span>  <span class="keyword">auto</span>&amp; os = *os_ptr;</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> </div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span>  os &lt;&lt; <span class="charliteral">&#39;[&#39;</span>;</div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> </div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span>  <span class="keyword">const</span> <span class="keyword">auto</span> hndl_or_null = native_handle_or_null();</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span>  <span class="keywordflow">if</span> (!hndl_or_null.null())</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span>  {</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span>    <span class="comment">// As of this writing it&#39;s, like, &quot;native_hndl[&lt;the FD&gt;]&quot; -- that looks pretty good and pithy.</span></div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span>    os &lt;&lt; hndl_or_null &lt;&lt; <span class="charliteral">&#39; &#39;</span>;</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span>  }</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// else { No need to output anything; pithier. }</span></div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span> </div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span>  <span class="keywordflow">if</span> (m_mdt_deserialized_ok)</div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span>  {</div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span>    <span class="keyword">const</span> <span class="keyword">auto</span> id_or_0 = id_or_none();</div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span>    <span class="keywordflow">if</span> (id_or_0 == 0)</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span>    {</div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span>      <span class="comment">/* Internal message.  Might as well simply print the entire metadata-header; it&#39;s all interesting, and</span></div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span><span class="comment">       * an internal message never reaches the user; so internal code may well want to print all this.</span></div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span><span class="comment">       * Plus there&#39;s simply nothing else to print, at all, so it&#39;s complete.</span></div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span><span class="comment">       * As in Msg_out::to_ostream() use the non-indent/newline pretty-print but no truncation needed. */</span></div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span>      os &lt;&lt; ::kj::str(internal_msg_body_root()).cStr();</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span>    }</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span>    <span class="keywordflow">else</span> <span class="comment">// if (id_or_0 != 0)</span></div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span>    {</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span>      <span class="comment">/* User message.  We should be somewhat judicious as to what to print; it does not strictly have to be</span></div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span><span class="comment">       * stuff available via public APIs -- but don&#39;t go overboard either.  E.g., session token is of low interest</span></div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span><span class="comment">       * and takes space more than anything and is an internal detail; but message ID and originating message ID</span></div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span><span class="comment">       * (if any) both help correlate messages versus other messages. */</span></div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span>      os &lt;&lt; <span class="stringliteral">&quot;id[&quot;</span> &lt;&lt; id_or_0 &lt;&lt; <span class="stringliteral">&quot;] &quot;</span>;</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span>      <span class="keyword">const</span> <span class="keyword">auto</span> originating_msg_id_or_0 = originating_msg_id_or_none();</div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span>      <span class="keywordflow">if</span> (originating_msg_id_or_0 != 0)</div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span>      {</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span>        os &lt;&lt; <span class="stringliteral">&quot;rsp_to_id[&quot;</span> &lt;&lt; originating_msg_id_or_0 &lt;&lt; <span class="stringliteral">&quot;] &quot;</span>;</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span>      }</div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> </div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span>      <span class="keywordflow">if</span> (m_body_deserialized_ok)</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span>      {</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span>        <span class="comment">// Similarly to Msg_out::to_ostream() print the body but truncated if needed.  @todo Code reuse?</span></div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span>        <span class="keyword">const</span> kj::String capnp_str = kj::str(body_root());</div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span>        <span class="keywordflow">if</span> (capnp_str.size() &gt; MAX_SZ)</div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span>        {</div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span>          os &lt;&lt; <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">String_view</a>(capnp_str.begin(), MAX_SZ - TRUNC_SUFFIX.size()) &lt;&lt; TRUNC_SUFFIX;</div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span>        }</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span>        <span class="keywordflow">else</span></div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span>        {</div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span>          os &lt;&lt; capnp_str.cStr();</div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span>        }</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span>      }</div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span>      <span class="keywordflow">else</span> <span class="comment">// if (!m_body_deserialized_ok)</span></div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span>      {</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span>        os &lt;&lt; <span class="stringliteral">&quot; ( incomplete )&quot;</span>; <span class="comment">// Perhaps we&#39;re being printed internally, before deserialize_body().</span></div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span>      }</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span>    } <span class="comment">// else if (id_or_0 != 0)</span></div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span>  }</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span>  <span class="keywordflow">else</span> <span class="comment">// if (!m_mdt_deserialized_ok)</span></div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span>  {</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span>    os &lt;&lt; <span class="stringliteral">&quot;( incomplete )&quot;</span>; <span class="comment">// Perhaps we&#39;re being printed internally, before deserialize_mdt().</span></div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span>  }</div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span> </div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span>  os &lt;&lt; <span class="stringliteral">&quot;]@&quot;</span> &lt;&lt; <span class="keyword">this</span>;</div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span>} <span class="comment">// Msg_in::to_ostream()</span></div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span> </div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span><a class="code hl_define" href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aad52996a4d66f74e21e4f2e74c93c763"> 1407</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1transport_1_1struc.html#ae272f248d74db0486c4d9411715db15d">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_define" href="msg_8hpp.html#a679f25e8d9dc9d3ad750442e92b640f0">CLASS_STRUCT_MSG_IN</a>&amp; val)</div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span>{</div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span>  val.to_ostream(&amp;os);</div>
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l01411" name="l01411"></a><span class="lineno"> 1411</span>}</div>
<div class="line"><a id="l01412" name="l01412"></a><span class="lineno"> 1412</span> </div>
<div class="line"><a id="l01413" name="l01413"></a><span class="lineno"> 1413</span><span class="preprocessor">#undef TEMPLATE_STRUCT_MSG_OUT</span></div>
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"> 1414</span><span class="preprocessor">#undef CLASS_STRUCT_MSG_OUT</span></div>
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span><span class="preprocessor">#undef TEMPLATE_STRUCT_MSG_IN</span></div>
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span><span class="preprocessor">#undef CLASS_STRUCT_MSG_IN</span></div>
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span> </div>
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span>} <span class="comment">// namespace ipc::transport::struc</span></div>
<div class="ttc" id="aasio__local__stream__socket__fwd_8hpp_html"><div class="ttname"><a href="asio__local__stream__socket__fwd_8hpp.html">asio_local_stream_socket_fwd.hpp</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html">ipc::transport::struc::Msg_in</a></div><div class="ttdoc">A structured in-message instance suitable as received and emittable (to user) by struc::Channel.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00545">msg.hpp:547</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a198052c9afc3f0f2727dd38214169b2b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a198052c9afc3f0f2727dd38214169b2b">ipc::transport::struc::Msg_in::m_mdt_root</a></div><div class="ttdeci">Mdt_reader m_mdt_root</div><div class="ttdoc">See internal_msg_body_root(); meaningless until m_mdt_deserialized_ok.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00831">msg.hpp:831</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a234708ed176f270f6372536ba3571b9a"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a234708ed176f270f6372536ba3571b9a">ipc::transport::struc::Msg_in::~Msg_in</a></div><div class="ttdeci">~Msg_in()</div><div class="ttdoc">Returns resources, potentially including potentially significant RAM resources, taken before emitting...</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a3a1a75d7d7b108d46efa1892dd2571b7"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a3a1a75d7d7b108d46efa1892dd2571b7">ipc::transport::struc::Msg_in::add_serialization_segment</a></div><div class="ttdeci">flow::util::Blob * add_serialization_segment(size_t max_sz)</div><div class="ttdoc">Prior to deserialization_*() obtains a memory area max_sz bytes long into which the user may write-to...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01138">msg.hpp:1138</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a4733178dead33f39d8f3bf60faef4723"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4733178dead33f39d8f3bf60faef4723">ipc::transport::struc::Msg_in::m_mdt_deserialized_ok</a></div><div class="ttdeci">bool m_mdt_deserialized_ok</div><div class="ttdoc">Starts false; becomes true immutably once deserialize_mdt() succeeds.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00825">msg.hpp:825</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a4783bd852b1dcba1542e0cfe37205e9e"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a4783bd852b1dcba1542e0cfe37205e9e">ipc::transport::struc::Msg_in::to_ostream</a></div><div class="ttdeci">void to_ostream(std::ostream *os) const</div><div class="ttdoc">Prints string representation to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01336">msg.hpp:1336</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a529a341e65bfb13b5a4caad131a37b0f"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a529a341e65bfb13b5a4caad131a37b0f">ipc::transport::struc::Msg_in::mdt_root</a></div><div class="ttdeci">const Mdt_reader &amp; mdt_root() const</div><div class="ttdoc">The Mdt root capnp-generated accessor object.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01323">msg.hpp:1323</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a56fa38feb9c907ae3f0f1a6ff16dd32f"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a56fa38feb9c907ae3f0f1a6ff16dd32f">ipc::transport::struc::Msg_in::body_root</a></div><div class="ttdeci">const Body_reader &amp; body_root() const</div><div class="ttdoc">The Body root capnp-generated accessor object.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01316">msg.hpp:1316</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a62c9c5fe295e00fc7672a7d256ec28f1"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a62c9c5fe295e00fc7672a7d256ec28f1">ipc::transport::struc::Msg_in::m_hndl_or_null</a></div><div class="ttdeci">Native_handle m_hndl_or_null</div><div class="ttdoc">See store_native_handle_or_null().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00844">msg.hpp:844</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a6e21b165a0673138db44d86584dd5059"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6e21b165a0673138db44d86584dd5059">ipc::transport::struc::Msg_in::Body_reader</a></div><div class="ttdeci">typename Body::Reader Body_reader</div><div class="ttdoc">Short-hand for capnp-generated read-only-accessing Reader nested class of Body. See body_root().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00555">msg.hpp:555</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a6fd10709650b97357f05bf9cf402c10e"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a6fd10709650b97357f05bf9cf402c10e">ipc::transport::struc::Msg_in::m_mdt_reader</a></div><div class="ttdeci">std::optional&lt; Reader &gt; m_mdt_reader</div><div class="ttdoc">Deserializes the metadata sub-message, invisible to user: the thing describing the user message (if a...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00813">msg.hpp:813</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a7ebd1458417e3ffea3220424aacced9c"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a7ebd1458417e3ffea3220424aacced9c">ipc::transport::struc::Msg_in::m_reader_config</a></div><div class="ttdeci">Reader_config m_reader_config</div><div class="ttdoc">See ctor.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00799">msg.hpp:799</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a880fb3eb4b037c9a06d0a683feed660f"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a880fb3eb4b037c9a06d0a683feed660f">ipc::transport::struc::Msg_in::internal_msg_body_root</a></div><div class="ttdeci">Internal_msg_body_reader internal_msg_body_root() const</div><div class="ttdoc">To be called only after deserialize_mdt(), similar to body_root() but for the internal-message root.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01308">msg.hpp:1308</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a8dbe5e947bef497468ff8fc84090b398"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a8dbe5e947bef497468ff8fc84090b398">ipc::transport::struc::Msg_in::m_body_root</a></div><div class="ttdeci">Body_reader m_body_root</div><div class="ttdoc">See body_root(); meaningless until m_body_deserialized_ok.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00834">msg.hpp:834</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a99df8a99bc2ed106d6a03f807e6e5966"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a99df8a99bc2ed106d6a03f807e6e5966">ipc::transport::struc::Msg_in::Mdt_reader</a></div><div class="ttdeci">typename Mdt::Reader Mdt_reader</div><div class="ttdoc">Same as Msg_mdt_out::Body_builder but the Reader instead.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00645">msg.hpp:645</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_a9bb1f48ee2a73c081cacf6c69df5a1be"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#a9bb1f48ee2a73c081cacf6c69df5a1be">ipc::transport::struc::Msg_in::session_token</a></div><div class="ttdeci">const Session_token &amp; session_token() const</div><div class="ttdoc">To be called only after deserialize_mdt(), returns session token tagging this in-message.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01301">msg.hpp:1301</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_aa408e309fcb402c061d969742874ca6c"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa408e309fcb402c061d969742874ca6c">ipc::transport::struc::Msg_in::Body</a></div><div class="ttdeci">Message_body Body</div><div class="ttdoc">See struc::Channel::Msg_body.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00552">msg.hpp:552</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_aa4c99d20d237670ba77769e721891b4b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aa4c99d20d237670ba77769e721891b4b">ipc::transport::struc::Msg_in::m_session_token</a></div><div class="ttdeci">Session_token m_session_token</div><div class="ttdoc">Starts uninitialized, this is assigned exactly once by deserialize_mdt(), storing the session-token t...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00841">msg.hpp:841</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_aad2c43c92a286ab7d186d810631a1701"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aad2c43c92a286ab7d186d810631a1701">ipc::transport::struc::Msg_in::Mdt</a></div><div class="ttdeci">schema::detail::StructuredMessage Mdt</div><div class="ttdoc">Same as Msg_mdt_out::Body.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00642">msg.hpp:642</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_aba0b83c9d8a7e8f782202406ca387e2c"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#aba0b83c9d8a7e8f782202406ca387e2c">ipc::transport::struc::Msg_in::native_handle_or_null</a></div><div class="ttdeci">Native_handle native_handle_or_null() const</div><div class="ttdoc">The Native_handle – potentially null meaning none – embedded in this message.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01330">msg.hpp:1330</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_ac14e45f1df2ade79bfe525a97d65469c"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac14e45f1df2ade79bfe525a97d65469c">ipc::transport::struc::Msg_in::originating_msg_id_or_none</a></div><div class="ttdeci">msg_id_t originating_msg_id_or_none() const</div><div class="ttdoc">To be called only after deserialize_mdt(), returns the message ID of the out-message to which this in...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01292">msg.hpp:1292</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_ac4f7c03e1080913f949b9b24b776dc6a"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ac4f7c03e1080913f949b9b24b776dc6a">ipc::transport::struc::Msg_in::store_native_handle_or_null</a></div><div class="ttdeci">void store_native_handle_or_null(Native_handle &amp;&amp;native_handle_or_null)</div><div class="ttdoc">Store the Native_handle (potentially .null(), meaning none) in this in-message.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01127">msg.hpp:1127</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_acc5514d773db8edb0d8d0c3d52743a6a"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acc5514d773db8edb0d8d0c3d52743a6a">ipc::transport::struc::Msg_in::deserialize_body</a></div><div class="ttdeci">void deserialize_body(Error_code *err_code)</div><div class="ttdoc">To be invoked after deserialize_mdt() == N, and add_serialization_segment() was called N times (with ...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01266">msg.hpp:1266</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_acd387ce27214601a70a0e1c6025075f1"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#acd387ce27214601a70a0e1c6025075f1">ipc::transport::struc::Msg_in::deserialize_mdt</a></div><div class="ttdeci">size_t deserialize_mdt(flow::log::Logger *logger_ptr, Error_code *err_code)</div><div class="ttdoc">To be invoked after exactly one successful add_serialization_segment() call (and that Blob being fill...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01161">msg.hpp:1161</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_ad2fd47038e8a8c06aa00661a8e1e9289"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad2fd47038e8a8c06aa00661a8e1e9289">ipc::transport::struc::Msg_in::Reader</a></div><div class="ttdeci">typename Reader_config::Reader Reader</div><div class="ttdoc">Same as Msg_out::Builder but the reader that can decode what that serializing Builder did.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00794">msg.hpp:794</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_ad42fc6c023dae0f6bf66ffb3a3437fa4"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ad42fc6c023dae0f6bf66ffb3a3437fa4">ipc::transport::struc::Msg_in::id_or_none</a></div><div class="ttdeci">msg_id_t id_or_none() const</div><div class="ttdoc">To be called only after deserialize_mdt(), returns the message ID of this in-message; 0 means it's an...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01285">msg.hpp:1285</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_ae3e6be294fbff87979a407a9e971da8a"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#ae3e6be294fbff87979a407a9e971da8a">ipc::transport::struc::Msg_in::Msg_in</a></div><div class="ttdeci">Msg_in(const Reader_config &amp;struct_reader_config)</div><div class="ttdoc">Constructs a not-ready-for-public-consumption in-message which awaits serialization-storing segments ...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01117">msg.hpp:1117</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_af29e72cdaf6edd4f0124bc9fe0c46592"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af29e72cdaf6edd4f0124bc9fe0c46592">ipc::transport::struc::Msg_in::m_body_reader</a></div><div class="ttdeci">std::optional&lt; Reader &gt; m_body_reader</div><div class="ttdoc">Like m_mdt_reader but for the user message if any.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00822">msg.hpp:822</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_af501f959aded43b1777937c895b92f5b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af501f959aded43b1777937c895b92f5b">ipc::transport::struc::Msg_in::m_body_deserialized_ok</a></div><div class="ttdeci">bool m_body_deserialized_ok</div><div class="ttdoc">Starts false; becomes true immutably once deserialize_body() succeeds (never if it's an internal mess...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00828">msg.hpp:828</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_af8c335ada1b33fcc732047283e60177b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#af8c335ada1b33fcc732047283e60177b">ipc::transport::struc::Msg_in::Reader_config</a></div><div class="ttdeci">Struct_reader_config Reader_config</div><div class="ttdoc">See struc::Channel::Reader_config.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00558">msg.hpp:558</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__in_html_afdc86a45b50e9869329b11a1e576b172"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__in.html#afdc86a45b50e9869329b11a1e576b172">ipc::transport::struc::Msg_in::Internal_msg_body_reader</a></div><div class="ttdeci">typename schema::detail::StructuredMessage::InternalMessageBody::Reader Internal_msg_body_reader</div><div class="ttdoc">Reader counterpart to Msg_mdt_out::Internal_msg_body_builder.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00639">msg.hpp:639</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html">ipc::transport::struc::Msg_out</a></div><div class="ttdoc">A structured out-message suitable to be sent via struc::Channel::send() (et al).</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00153">msg.hpp:154</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a0e66b941a2b67ec21087581d1e44f42b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a0e66b941a2b67ec21087581d1e44f42b">ipc::transport::struc::Msg_out::Builder_config</a></div><div class="ttdeci">typename Builder::Config Builder_config</div><div class="ttdoc">Short-hand for user-specified Struct_builder::Config.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00174">msg.hpp:174</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a31538b5675e0deb607f74d97e9205cf6"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a31538b5675e0deb607f74d97e9205cf6">ipc::transport::struc::Msg_out::m_hndl_or_null</a></div><div class="ttdeci">Native_handle m_hndl_or_null</div><div class="ttdoc">The Native_handle, if any, embedded inside this message.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00483">msg.hpp:483</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a50c8fd96304e09aaf9bbacd9959c07d6"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a50c8fd96304e09aaf9bbacd9959c07d6">ipc::transport::struc::Msg_out::Msg_out</a></div><div class="ttdeci">Msg_out(Msg_out &amp;&amp;src)</div><div class="ttdoc">Move ctor: Make *this equal to src, while src becomes as-if default-cted (in that any operation excep...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00902">msg.hpp:902</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a53a9746fdabdefcaf1f9bf63c81c6d85"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a53a9746fdabdefcaf1f9bf63c81c6d85">ipc::transport::struc::Msg_out::operator=</a></div><div class="ttdeci">Msg_out &amp; operator=(const Msg_out &amp;)=delete</div><div class="ttdoc">Disallow copying.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a66eade858d6b311d6e2d633b43ee71ad"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a66eade858d6b311d6e2d633b43ee71ad">ipc::transport::struc::Msg_out::body_root</a></div><div class="ttdeci">const Body_builder * body_root() const</div><div class="ttdoc">Equivalent to the other body_root() overload but immutable version.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01024">msg.hpp:1024</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a68188b480ac3c33676b08dce72d92922"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a68188b480ac3c33676b08dce72d92922">ipc::transport::struc::Msg_out::Body_builder</a></div><div class="ttdeci">typename Body::Builder Body_builder</div><div class="ttdoc">Short-hand for capnp-generated mutating Builder nested class of Body. See body_root().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00162">msg.hpp:162</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a6a9b086eedafe0a5fc71695812677cdb"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6a9b086eedafe0a5fc71695812677cdb">ipc::transport::struc::Msg_out::operator=</a></div><div class="ttdeci">Msg_out &amp; operator=(Msg_out &amp;&amp;src)</div><div class="ttdoc">Move assignment: Destroy *this contents; make *this equal to src, while src becomes as-if default-cte...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00988">msg.hpp:988</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a6fe17e3ce3e3569e7b08538f525918e9"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a6fe17e3ce3e3569e7b08538f525918e9">ipc::transport::struc::Msg_out::~Msg_out</a></div><div class="ttdeci">~Msg_out()</div><div class="ttdoc">Returns resources, including potentially significant RAM resources and native_handle_or_null(),...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00979">msg.hpp:979</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a754e0f025f471105d52b3b090c27f1c0"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a754e0f025f471105d52b3b090c27f1c0">ipc::transport::struc::Msg_out::to_ostream</a></div><div class="ttdeci">void to_ostream(std::ostream *os) const</div><div class="ttdoc">Prints string representation to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01072">msg.hpp:1072</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a90ba424b2c68cae89597356458b5c570"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a90ba424b2c68cae89597356458b5c570">ipc::transport::struc::Msg_out::m_body_root</a></div><div class="ttdeci">Body_builder m_body_root</div><div class="ttdoc">See body_root().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00480">msg.hpp:480</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a91d2575343b28f83e22a71e7f7b3ff40"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a91d2575343b28f83e22a71e7f7b3ff40">ipc::transport::struc::Msg_out::emit_serialization</a></div><div class="ttdeci">void emit_serialization(Segment_ptrs *target_blobs, const typename Builder::Session &amp;session, Error_code *err_code) const</div><div class="ttdoc">Returns the serialization in the form of a sequence of 1+ Blobs.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01059">msg.hpp:1059</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9289790ac6b85681c8697fc55ff8f3a7"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9289790ac6b85681c8697fc55ff8f3a7">ipc::transport::struc::Msg_out::Msg_out</a></div><div class="ttdeci">Msg_out()</div><div class="ttdoc">Creates non-message; any operation except move-to or destruction results in undefined behavior subseq...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00867">msg.hpp:867</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9303c71f8f459ede25ebe0c8f5492393"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9303c71f8f459ede25ebe0c8f5492393">ipc::transport::struc::Msg_out::orphanage</a></div><div class="ttdeci">Orphanage orphanage()</div><div class="ttdoc">Convenience method that returns a capnp::Orphan factory in the same capnp::MessageBuilder as body_roo...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01030">msg.hpp:1030</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9738acbcfb431dc1fc0174b42787060b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9738acbcfb431dc1fc0174b42787060b">ipc::transport::struc::Msg_out::Msg_out</a></div><div class="ttdeci">Msg_out(Builder &amp;&amp;struct_builder)</div><div class="ttdoc">Advanced technique: Creates message by subsuming the provided already-prepared Capnp_msg_builder_inte...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00886">msg.hpp:886</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9894ad7ec2a46641c4b9b86664d0d465"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9894ad7ec2a46641c4b9b86664d0d465">ipc::transport::struc::Msg_out::body_root</a></div><div class="ttdeci">Body_builder * body_root()</div><div class="ttdoc">The Body root capnp-generated mutator object.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01018">msg.hpp:1018</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9d4ab66d2740f40a88f476d46dd04f1e"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9d4ab66d2740f40a88f476d46dd04f1e">ipc::transport::struc::Msg_out::Msg_out</a></div><div class="ttdeci">Msg_out(const Builder_config &amp;struct_builder_config)</div><div class="ttdoc">Creates blank Body-bearing out-message message, with no native handle, all of which can be modified v...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00874">msg.hpp:875</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_a9e5271db0ea2b86ec4c68a91c60dd17a"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#a9e5271db0ea2b86ec4c68a91c60dd17a">ipc::transport::struc::Msg_out::Msg_out</a></div><div class="ttdeci">Msg_out(const Msg_out &amp;)=delete</div><div class="ttdoc">Disallow copying.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_aa783b92d94937ebb5d95b7ad5f2c9e37"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aa783b92d94937ebb5d95b7ad5f2c9e37">ipc::transport::struc::Msg_out::m_builder</a></div><div class="ttdeci">Builder m_builder</div><div class="ttdoc">The guy serializing a Body. Underlying serialization potentially futher mutated by user via body_root...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00459">msg.hpp:459</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_aab352abf2ced76f2bad6700d75290132"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aab352abf2ced76f2bad6700d75290132">ipc::transport::struc::Msg_out::Body</a></div><div class="ttdeci">Message_body Body</div><div class="ttdoc">See struc::Channel::Msg_body.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00159">msg.hpp:159</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_aae507a42f29546fa13075a438d96f3f5"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aae507a42f29546fa13075a438d96f3f5">ipc::transport::struc::Msg_out::Builder</a></div><div class="ttdeci">Struct_builder_t Builder</div><div class="ttdoc">Short-hand for user-specified Struct_builder type.</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00168">msg.hpp:168</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_acd04d61cf19ad87610598fddbb5d8052"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#acd04d61cf19ad87610598fddbb5d8052">ipc::transport::struc::Msg_out::Orphanage</a></div><div class="ttdeci">::capnp::Orphanage Orphanage</div><div class="ttdoc">Short-hand for capnp orphan factory. See orphanage().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00177">msg.hpp:177</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_aced8ef8237617c74aaf06832d1385fed"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#aced8ef8237617c74aaf06832d1385fed">ipc::transport::struc::Msg_out::store_native_handle_or_null</a></div><div class="ttdeci">void store_native_handle_or_null(Native_handle &amp;&amp;native_handle_or_null)</div><div class="ttdoc">Store the Native_handle (potentially .null(), meaning none) in this out-message; no-ops if the same ....</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01038">msg.hpp:1038</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_adb630aeb1bb9e9335631f9e9e6dc25de"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#adb630aeb1bb9e9335631f9e9e6dc25de">ipc::transport::struc::Msg_out::n_serialization_segments</a></div><div class="ttdeci">size_t n_serialization_segments() const</div><div class="ttdoc">Returns what target_blobs.size() would return after calling emit_serialization(&amp;target_blobs) (with a...</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01066">msg.hpp:1066</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1Msg__out_html_ae033461f1404be60262033bafcfaccba"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1Msg__out.html#ae033461f1404be60262033bafcfaccba">ipc::transport::struc::Msg_out::native_handle_or_null</a></div><div class="ttdeci">Native_handle native_handle_or_null() const</div><div class="ttdoc">Returns whatever was the last word according to store_native_handle_or_null().</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l01053">msg.hpp:1053</a></div></div>
<div class="ttc" id="aipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp_html"><div class="ttname"><a href="ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html">error.hpp</a></div></div>
<div class="ttc" id="amsg_8hpp_html_a0052ea1afda1ed94e008805d40264c20"><div class="ttname"><a href="msg_8hpp.html#a0052ea1afda1ed94e008805d40264c20">TEMPLATE_STRUCT_MSG_OUT</a></div><div class="ttdeci">#define TEMPLATE_STRUCT_MSG_OUT</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00852">msg.hpp:852</a></div></div>
<div class="ttc" id="amsg_8hpp_html_a679f25e8d9dc9d3ad750442e92b640f0"><div class="ttname"><a href="msg_8hpp.html#a679f25e8d9dc9d3ad750442e92b640f0">CLASS_STRUCT_MSG_IN</a></div><div class="ttdeci">#define CLASS_STRUCT_MSG_IN</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00861">msg.hpp:861</a></div></div>
<div class="ttc" id="amsg_8hpp_html_af03d0377672ffdd140776914e4b98872"><div class="ttname"><a href="msg_8hpp.html#af03d0377672ffdd140776914e4b98872">TEMPLATE_STRUCT_MSG_IN</a></div><div class="ttdeci">#define TEMPLATE_STRUCT_MSG_IN</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00858">msg.hpp:858</a></div></div>
<div class="ttc" id="amsg_8hpp_html_af8ab263935b3bae1c9ee6355a55fa94a"><div class="ttname"><a href="msg_8hpp.html#af8ab263935b3bae1c9ee6355a55fa94a">CLASS_STRUCT_MSG_OUT</a></div><div class="ttdeci">#define CLASS_STRUCT_MSG_OUT</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="msg_8hpp_source.html#l00855">msg.hpp:855</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1asio__local__stream__socket_html_af0833f160dffd7f1c6921d27883a186b"><div class="ttname"><a href="namespaceipc_1_1transport_1_1asio__local__stream__socket.html#af0833f160dffd7f1c6921d27883a186b">ipc::transport::asio_local_stream_socket::release_native_peer_socket</a></div><div class="ttdeci">void release_native_peer_socket(Native_handle &amp;&amp;peer_socket_native_or_null)</div><div class="ttdoc">Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.</div><div class="ttdef"><b>Definition:</b> <a href="asio__local__stream__socket_8cpp_source.html#l00415">asio_local_stream_socket.cpp:415</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1error_html_a990b9ff850cf9aaf354efdd07d86a71da26ab25e100104aeb567d90f794313e3b"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1error.html#a990b9ff850cf9aaf354efdd07d86a71da26ab25e100104aeb567d90f794313e3b">ipc::transport::struc::error::Code::S_STRUCT_CHANNEL_INTERNAL_PROTOCOL_MISUSED_SCHEMA</a></div><div class="ttdeci">@ S_STRUCT_CHANNEL_INTERNAL_PROTOCOL_MISUSED_SCHEMA</div><div class="ttdoc">Structured channel: received structured message with invalid internally-set/used fields.</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_abfde278018c84aa1542475e9a4089c29"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">ipc::transport::struc::shm::classic::Builder</a></div><div class="ttdeci">Builder&lt; ipc::shm::classic::Pool_arena &gt; Builder</div><div class="ttdoc">Convenience alias: transport::struc::shm::Builder that works with boost.ipc.shm pools from ipc::shm::...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html#l00036">classic_fwd.hpp:36</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_af94f8698ca62a84d6366aaa931375d41"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#af94f8698ca62a84d6366aaa931375d41">ipc::transport::struc::shm::classic::Reader</a></div><div class="ttdeci">Reader&lt; ipc::shm::classic::Pool_arena &gt; Reader</div><div class="ttdoc">Convenience alias: transport::struc::shm::Reader that works with boost.ipc.shm pools from ipc::shm::c...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html#l00039">classic_fwd.hpp:39</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html">ipc::transport::struc</a></div><div class="ttdoc">Sub-module of Flow-IPC module ipc::transport providing transmission of structured messages specifical...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp_source.html#l00030">channel.cpp:31</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html_a6751c05fb6582a34c7c47ac470c4a48b"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html#a6751c05fb6582a34c7c47ac470c4a48b">ipc::transport::struc::Session_token</a></div><div class="ttdeci">boost::uuids::uuid Session_token</div><div class="ttdoc">A type used by struc::Channel for internal safety/security/auth needs.</div><div class="ttdef"><b>Definition:</b> <a href="struc__fwd_8hpp_source.html#l00113">struc_fwd.hpp:113</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html_a82a69eaa39cbe8a002de1266f1cbb5cb"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html#a82a69eaa39cbe8a002de1266f1cbb5cb">ipc::transport::struc::Segment_ptrs</a></div><div class="ttdeci">std::vector&lt; flow::util::Blob * &gt; Segment_ptrs</div><div class="ttdoc">Sequence of 1+ Blob pointers to blobs which must stay alive while these pointers may be dereferenced,...</div><div class="ttdef"><b>Definition:</b> <a href="struc__fwd_8hpp_source.html#l00122">struc_fwd.hpp:122</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html_ae272f248d74db0486c4d9411715db15d"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html#ae272f248d74db0486c4d9411715db15d">ipc::transport::struc::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Heap_fixed_builder &amp;val)</div><div class="ttdoc">Prints string representation of the given Heap_fixed_builder to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="heap__serializer_8cpp_source.html#l00132">heap_serializer.cpp:132</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_html_af7f35fc7588d97a838274fa25700ead9"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc.html#af7f35fc7588d97a838274fa25700ead9">ipc::transport::struc::msg_id_t</a></div><div class="ttdeci">uint64_t msg_id_t</div><div class="ttdoc">Message ID uniquely identifying outgoing message (Msg_out, among all other Msg_outs),...</div><div class="ttdef"><b>Definition:</b> <a href="struc__fwd_8hpp_source.html#l00145">struc_fwd.hpp:145</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html_a7ee4551983d9df16ec16a3139bac50e8"><div class="ttname"><a href="namespaceipc_1_1transport.html#a7ee4551983d9df16ec16a3139bac50e8">ipc::transport::Native_handle</a></div><div class="ttdeci">util::Native_handle Native_handle</div><div class="ttdoc">Convenience alias for the commonly used type util::Native_handle.</div><div class="ttdef"><b>Definition:</b> <a href="transport__fwd_8hpp_source.html#l00081">transport_fwd.hpp:81</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae6ac47812a90d1287c61e0b7de7bc4f5"><div class="ttname"><a href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">ipc::util::String_view</a></div><div class="ttdeci">flow::util::String_view String_view</div><div class="ttdoc">Short-hand for Flow's String_view.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00115">util_fwd.hpp:115</a></div></div>
<div class="ttc" id="anamespaceipc_html_aa3192e586cc45d3e7c22463bf2760f89"><div class="ttname"><a href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">ipc::Error_code</a></div><div class="ttdeci">flow::Error_code Error_code</div><div class="ttdoc">Short-hand for flow::Error_code which is very common.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00298">common.hpp:298</a></div></div>
<div class="ttc" id="anative__handle_8hpp_html"><div class="ttname"><a href="native__handle_8hpp.html">native_handle.hpp</a></div></div>
<div class="ttc" id="astructipc_1_1util_1_1Native__handle_html"><div class="ttname"><a href="structipc_1_1util_1_1Native__handle.html">ipc::util::Native_handle</a></div><div class="ttdoc">A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.</div><div class="ttdef"><b>Definition:</b> <a href="native__handle_8hpp_source.html#l00062">native_handle.hpp:63</a></div></div>
<div class="ttc" id="atransport__fwd_8hpp_html"><div class="ttname"><a href="transport__fwd_8hpp.html">transport_fwd.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 11 2025 20:02:26 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
